需要帮助。
有一个文件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**".
有人可以帮我找到我错的地方。
提前致谢。
答案 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