对于模块级的功能,这样的代码保存:为什么有必要将self作为方法装饰器的参数?
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__
的一部分?
滑稽,如果使用在第一实施例的装饰(所以不需要重新定义分解(f)如方法级),那么它没有“自我”的呼唤,也在课堂上工作。 '@dec def foo(arg1):pass'然后将被调用为Test.foo('bar').. – Uvar