0

我想为用户创建一个模型类。用户的数据存储在基于文档的数据库中,如 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

4 回答 4

2

您需要实现该__getattr__(self, name) 方法

于 2013-01-15T08:34:22.197 回答
1

对对象属性的访问由getattr/setattr/delattr/getattribute 机制控制

于 2013-01-15T08:25:21.543 回答
1

Django 使用元类来动态创建模型。虽然您的要求略有不同,但相同的技术将起作用(可能比装饰器更好)。

您可以在 Stackoverflow 上阅读有关 Python 元类的更多信息

于 2013-01-15T09:00:03.180 回答
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的方式吗?

于 2013-01-15T09:16:49.793 回答