假设我有一个定义了装饰器的类
class Foo():
def decorate(param):
def wrapper(func):
def wrapped(*args, **kwargs):
# do something
return func(*args, **kwargs)
return wrapped
return wrapper
然后我决定在另一个类中调用这个decorator,像这样:
class Bar():
foo = Foo()
param = something
@foo.decorate(param)
def func():
# do something
这会引发一个TypeError
异常:
TypeError: decorate() takes 1 positional argument but 2 were given
我不明白这里出了什么问题。应用相同的装饰器,但在相同的类Bar
中定义工作良好,但为什么它不能工作在不同的类? 你的decorate()
函数应该是一个实例方法,因此它接受实例本身作为第一个参数,当你调用- @foo.decorate(param)
时,你试图传递它两个参数(因为foo
是Foo
类的实例)实例本身,以及param
,这是导致问题的。
您应该转换您的decorate()
方法以接受实例作为第一个参数。例子——
class Foo():
def decorate(self, param):
def wrapper(func):
def wrapped(*args, **kwargs):
# do something
return func(*args, **kwargs)
return wrapped
return wrapper
另一件事,你的func()
也是一个实例方法,也需要self
。例子——
class Bar():
foo = Foo()
param = something
@foo.decorate(param)
def func(self):
# do something
你只是忘了包括self
;您正在调用Foo().decorate()
,一个绑定方法,因此实例将被传入:
class Foo():
def decorate(self, param):
注意,这同样适用于您的Bar.func()
函数:
class Bar():
foo = Foo()
param = something
@foo.decorate(param)
def func(self):
# do something