decorators - Python Decorator también para atributos indefinidos
python decoradores (4)
Me gustaría crear una clase de modelo para un usuario. Los datos del usuario se almacenan en una base de datos basada en documentos como couchdb o mongodb. El usuario de la clase debe tener un decorador y los campos ind el db son accesibles sobre los atributos de clase realmente no existentes. Por ejemplo
@DocumentDB()
class User(object):
def doSomething(self):
pass
def doSomethingElse(self):
pass
u = User(''thisIsAUniqUserId'')
print u.emailAddress
print u.lastName
He jugado con decoradores de pitones. La manipulación de funciones existentes no es una gran cosa, pero ¿cómo puedo captar la convocatoria de no existentes getters / setters para crear un acceso transparente a los valores db a través de la instancia del objeto?
Creo que encontré una solución basada en tus sugerencias:
def DocumentDB(object):
class TransparentAttribute:
def __init__(self, *args, **kargs):
self.wrapped = object(*args, **kargs)
def __getattr__(self, attrname):
return "Any Value"
return TransparentAttribute
@DocumentDB
class User(object):
def doSomething(self):
pass
def doSomethingElse(self):
pass
u = User()
print u.emailAddress
print u.lastName
Funciona, pero ¿es la forma más pythoniastic?
Django usa metaclases para crear modelos dinámicamente . Si bien sus requisitos son un poco diferentes, la misma técnica funcionará (probablemente mejor que los decoradores).
El acceso a los atributos de un objeto se rige por el mecanismo getattr / setattr / delattr / getattribute .
Necesita implementar el __getattr__(self, name)
.