【发布时间】:2018-03-02 02:14:18
【问题描述】:
我正在尝试编写一个可以添加到实例方法和非实例方法中的装饰器。我已将我的代码减少到一个最小的例子来证明我的观点
def call(fn):
def _impl(*args, **kwargs):
return fn(*args, **kwargs)
fn.call = _impl
return fn
class Foo(object):
@call
def bar(self):
pass
Foo().bar.call()
这给出了漂亮的错误
Traceback (most recent call last):
File "/tmp/511749370/main.py", line 14, in <module>
Foo().bar.call()
File "/tmp/511749370/main.py", line 3, in _impl
return fn(*args, **kwargs)
TypeError: bar() missing 1 required positional argument: 'self'
有没有可能在不求助的情况下做这样的事情
Foo.bar.call(Foo())
或者这是我唯一的选择?
【问题讨论】:
-
查看解决方案:stackoverflow.com/questions/7590682/access-self-from-decorator。我知道这不是完全相同的问题,但它可能会有所帮助。
-
@IdanMeyer 我尝试将
self作为参数添加到_impl,但这只是将错误转移到_impl() missing 1 required positional argument: 'self',我尝试使用fn.__self__,这会引发AttributeError。
标签: python