6

如何在类定义中引用类对象?你能告诉我你会怎么做吗?或者更具体地说,您如何在类方法的装饰器中传递类对象?这是一个简单的示例,我正在尝试将我声明的第二种方法传递给第一个装饰器。

def decorate(w):
    def _wrap(f):
        def _call(*args, **kwargs):
            return w(f(*args, **kwargs))
        def _call
    return _wrap

class A():

    @dec(A.w)
    def f():
        return 2

    def w(f):
        return fr + 5 

正如预期的那样,引发了异常

NameError: name 'A' is not defined

作为我的调查的结果,我了解到当我在里面时globals()不包含key或函数,但在里面定义。所以我可能可以通过字符串名称(例如)找到传递的方法,但在这种情况下,不可能在闭包内缓存方法搜索。Adecorate_wrap_call@dec('A.w')_wrap

那么你如何解决这个问题?:)

4

1 回答 1

6

您不能,因为在类定义期间,该类尚不存在

您可以在创建类后应用装饰器:

class A():
    def f(self):
        return 2

    def w(self, f):
        return fr + 5 

A.f = dec(A.w)(A.f.__func__)

或者您可以交换两个方法定义的顺序并w仍然称为本地名称:

class A():
    def w(self, f):
        return fr + 5 

    @dec(w)
    def f(self):
        return 2

在这两种情况下,您都传递了一个未绑定到实例的可调用A.w对象。No将被传入,因此您需要在装饰器中自己添加:self

def decorate(w):
    def _wrap(f):
        def _call(self, *args, **kwargs):
            return w(self, f(*args, **kwargs))
        def _call
    return _wrap

如果您不希望w绑定(它充当静态方法),您可以在这里使用普通函数。

一般来说,在同一个实例上创建一个装饰器来调用另一个方法是没有意义的;为什么不直接w从内部调用f呢?

class A():
    def f(self):
        return self.w(2)

    def w(self, f):
        return fr + 5 
于 2013-11-17T19:35:58.580 回答