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
那么你如何解决这个问题呢?:)
你不能,因为在类定义期间,该类尚不存在.
您可以在创建类后应用装饰器:
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)
| 归档时间: |
|
| 查看次数: |
3649 次 |
| 最近记录: |