传递装饰器

时间:2016-07-12 03:32:22

标签: python

需要帮助。

有一个文件with_class.py,它保存了类上decorator的实现。该函数正在从另一个文件use_class.py中调用。

with_class.py

def __init__(self,f):
     self.f = f 
def __call__(self,x): 
     self.f(x) 

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

use_class.py

import with_class
a = with_class.foo(x)

工作正常。 现在,如果我想传递一个函数来代替x。 我有在with_class.py和use_class.py中定义的函数我要传递给" a = with_class.foo(with_class.decorate.disp())" 。 disp()是类中定义的函数。上面的代码现在看起来像:

with_class.py

class decorate: 
       def __init__(self,f): 
           self.f = f 
       def __call__(self,g):
           self.f(g) 

      def disp(self):
          print "inside the display"

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

use_class.py

import with_class
a = with_class.foo(with_class.decorate.disp())

我收到错误

"**TypeError: unbound method disp() must be called with decorate instance as first argument**".

有人可以帮我找到我错的地方。

提前致谢。

1 个答案:

答案 0 :(得分:1)

foo的参数必须是函数。这段代码

with_class.foo(with_class.decorate.disp())

完全等效
x = with_class.decorate.disp()
with_class.foo(x)

当您调用with_class.decorate.disp()时,第一行会出现错误,因为disp是一种实例方法,只能在decorate实例上调用。你不想打disp;你想把它作为一个参数传递给foo。像这样:

class decorate: 
    def __init__(self,f):
        print("decorate constructor")
        self.f = f 
    def __call__(self,g):
        print("Call", g)
        self.f(g)
        print("Call ended")
    @staticmethod
    def disp():
        print("inside the display")

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

print("About to foo")
foo(decorate.disp)    

运行它(Python3)给出:

decorate constructor
About to foo
Call <function decorate.disp at 0x02A2D108>
inside foo
inside the display
Call ended