如何在python中实现面向对象程序的装饰器

时间:2016-07-06 16:40:05

标签: python python-2.7

对装饰者有疑问。我试图理解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__,但它也会出错。 似乎我没有得到这个概念。

1 个答案:

答案 0 :(得分:2)

什么

@decorate
def foo():
    print "inside foo"

相当于

def foo():
    print "inside foo"

foo = decorate(foo)

因此foodecorate模块中绑定的修饰函数(类with_class的对象)的名称。从use_class.py开始,您应该

import with_class

a = with_class.foo()