[英]Python: Calling a decorator method from another class
假设我有一个定义装饰器的类
class Foo():
def decorate(param):
def wrapper(func):
def wrapped(*args, **kwargs):
# do something
return func(*args, **kwargs)
return wrapped
return wrapper
然后我决定在另一个类中调用该装饰器,如下所示:
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.