【发布时间】:2018-01-16 03:04:06
【问题描述】:
对于模块级函数,此代码包含:
def dec(f):
def wrap(*args, **kwargs):
f(*args, **kwargs)
return wrap
@dec
def foo(arg1):
pass
然而,当装饰方法时,突然之间,你必须有一个参数来捕获实例。
def dec(f):
def wrap(self, *args, **kwargs):
f(self, *args, **kwargs)
return wrap
class Test:
def __init__(self):
pass
@dec
def foo(self, arg1):
pass
为什么会这样? self 有什么特别之处以至于 *args 无法捕捉到它?毕竟,这不只是另一个立场论点吗?
另外,它(self)是如何传递给内部wrap函数的?
对于第一种情况,它简单地等同于foo = dec(foo)。根据我对闭包的了解,在 foo 作为参数传递给装饰器之前。它使用__closure__ 创建一个外壳,因此它能够保留传递给foo 的任何参数。
为什么说到方法,显然self 似乎不是__closure__ 的一部分?
【问题讨论】:
-
有趣的是,如果您使用第一个示例的装饰器(因此没有在方法级别重新定义 dec(f)),那么它也可以在类内部工作,而无需调用“self”。
@dec def foo(arg1): pass然后可以调用为 Test.foo('bar')..
标签: python decorator python-decorators