Python Decorator也用于未定义的属性

时间:2013-01-15 08:15:21

标签: python properties model couchdb decorator

我想为用户创建一个Model Class。用户的数据存储在基于文档的数据库中,如couchdb或mongodb。 User类应该有一个装饰器,db中的字段可以通过不存在的类属性访问。例如

@DocumentDB()
class User(object):
    def doSomething(self):
        pass
    def doSomethingElse(self):
        pass

u = User('thisIsAUniqUserId')
print u.emailAddress
print u.lastName

我玩过python装饰器。操作现有函数并不是一件大事,但我如何能够捕获不存在的getter / setter来调用通过对象实例创建对db值的透明访问?

4 个答案:

答案 0 :(得分:2)

您需要实施__getattr__(self, name) method

答案 1 :(得分:1)

访问对象的属性受getattr/setattr/delattr/getattribute mechanism

的约束

答案 2 :(得分:1)

Django使用metaclasses to dynamically create models。虽然您的要求稍有不同,但相同的技术可能会起作用(可能比装饰者更好)。

你可以read more about Python metaclasses on Stackoverflow

答案 3 :(得分:0)

我想我找到了一个基于你的建议的解决方案:

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

它有效,但它是最pythoniastic方式?