如何在类定义中引用类对象?你能告诉我你会怎么做吗?或者更具体地说,你如何在类方法的装饰器中传递类对象? 这是一个简单的例子,我试图将我声明的第二个方法传递给第一个方法的装饰器。
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
作为我调查的结果,我了解到当我在 decorate
或 _wrap
函数,但在 _call
中定义。所以我可能可以通过字符串名称找到传递的方法(例如 @dec('A.w')
),但在那种情况下,不可能在 _wrap
中缓存方法搜索关闭。
那么你如何解决这个问题? :)
最佳答案
你不能,因为在类定义期间,类还不存在。
您可以在创建类后应用装饰器:
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
在这两种情况下,您都传递了一个未绑定(bind)到实例的可调用A.w
。不会传入 self
,因此您需要在装饰器中自己添加:
def decorate(w):
def _wrap(f):
def _call(self, *args, **kwargs):
return w(self, f(*args, **kwargs))
def _call
return _wrap
如果您不希望 w
被 绑定(bind)(它充当静态方法),您可以在这里使用普通函数。
一般来说,在同一个实例上创建一个装饰器来调用另一个方法是没有意义的;为什么不直接从 f
中调用 w
,直接?
class A():
def f(self):
return self.w(2)
def w(self, f):
return fr + 5
关于python - 类定义中的自引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20035153/