【问题标题】:Python Decorated Class does not allow method calls. Why?Python 装饰类不允许方法调用。为什么?
【发布时间】:2023-04-05 06:15:01
【问题描述】:

正如我在this 上一篇文章中提到的。我正在尝试创建一个装饰器,它执行以下操作:

装饰类表示基于文档的数据库(如 CouchDB 或 MongoDB)中的文档。 Decorator 接受 on 参数,该参数是此类数据库的连接器实例。模型类(在此示例中为用户)会自动将未定义的属性映射到数据库中的字段。

现在我有点卡住了:-/ 提到的东西都在工作。但现在我不能从模型类中调用任何方法。我收到以下错误。

TypeError:未绑定的方法 myfunc() 必须与用户实例一起调用
作为第一个参数(一无所获)

class Connector(object):
    def readvar(self, var):
        data = {"emailAddress":"jack.bauer@ctu.org", "lastName":"Bauer"}
        return data[var]

class DocumentDB(object):
    def __init__(self,connector):
        self.connector = connector

    def __call__(self, *args, **kargs):
        _c = self.connector

        class TransparentAttribute:         
            def __getattr__(self, attrname):
                try:
                    return _c.readvar(attrname)
                except:
                    return getattr(args[0], attrname)
        return TransparentAttribute

c = Connector()
@DocumentDB(c)
class User(object):

    username = "JackBauer"
    def doSomething(self):
        print "bla bla"
    def doSomethingElse(self):
        pass
    def myfunc(self):
        print "afadsadsf adsf asdf asdf"

u = User()
u.myfunc() # Does not work!!!
print u.emailAddress
print u.lastName
print u.username

【问题讨论】:

  • 您能否显示错误的完整回溯,包括它发生的行?
  • @DavidRobinson 我运行了相同的代码,得到了简单的Traceback (most recent call last): File "<module1>", line 52, in <module> TypeError: unbound method myfunc() must be called with User instance as first argument (got nothing instead)(在线u.myfunc()

标签:
python
class
methods
couchdb
decorator