在类定义中自引用

Gen*_* D. 5 python class decorator class-members python-decorators

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

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 
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,提出了例

NameError: name 'A' is not defined
Run Code Online (Sandbox Code Playgroud)

由于我的调查,我了解到,当我在内部或功能时,globals()不包含A键,但在内部定义.所以我可能会找到通过字符串名称传递的方法(例如),但在这种情况下,不可能在闭包内缓存方法搜索.decorate_wrap_call@dec('A.w')_wrap

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

Mar*_*ers 5

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

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

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

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

A.f = dec(A.w)(A.f.__func__)
Run Code Online (Sandbox Code Playgroud)

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

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

    @dec(w)
    def f(self):
        return 2
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,你传递一个可调用的A.w绑定到一个实例.不会self传入,所以你需要在装饰器中自己添加:

def decorate(w):
    def _wrap(f):
        def _call(self, *args, **kwargs):
            return w(self, f(*args, **kwargs))
        def _call
    return _wrap
Run Code Online (Sandbox Code Playgroud)

如果你没想到w束缚(它充当不是静态方法),你可以只使用一个正常的功能,而不是在这里.

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

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

    def w(self, f):
        return fr + 5 
Run Code Online (Sandbox Code Playgroud)