对装饰者有疑问。我试图理解python中的装饰器概念,但在类中使用了装饰器。 的 with_class.py
class decorate:
def __init__(self,f):
self.f = f
def __call__(self)
self.f()
@decorate
def foo():
print "inside foo"
foo()
我将整个代码放在一个.py文件中,并按预期执行。 输出:里面的foo
但后来我尝试在另一个.py文件中为类装饰创建一个对象并尝试执行以获得相同的输出。
在第一个.py文件中对foo()
进行了评论,并在第二个.py文件中使用了以下代码。
use_class.py
import with_class
a = with_class.decorate()
但它正在抛出错误TypeError: __init__ takes exactly 2 arguments(1 given)
。预计在调用__init__
时我们应该提供2个参数。
但是我没有得到通过foo
执行方法use_class.py
的内容。
我再一次尝试从__call__(self,f)
移除f
来使用__init__
,但它也会出错。
似乎我没有得到这个概念。
答案 0 :(得分:2)
什么
@decorate
def foo():
print "inside foo"
相当于
def foo():
print "inside foo"
foo = decorate(foo)
因此foo
是decorate
模块中绑定的修饰函数(类with_class
的对象)的名称。从use_class.py
开始,您应该
import with_class
a = with_class.foo()