Python: 从另一个调用装饰器方法 class
Python: Calling a decorator method from another class
假设我有一个 class 定义了装饰器
class Foo():
def decorate(param):
def wrapper(func):
def wrapped(*args, **kwargs):
# do something
return func(*args, **kwargs)
return wrapped
return wrapper
然后我决定在另一个 class 中调用该装饰器,如下所示:
class Bar():
foo = Foo()
param = something
@foo.decorate(param)
def func():
# do something
这引发了一个 TypeError
异常:
TypeError: decorate() takes 1 positional argument but 2 were given
我不明白这里出了什么问题。应用相同的装饰器但在相同的 class Bar
中定义工作正常,但为什么它不能在不同的 classes 上工作?
你的 decorate()
函数应该是一个实例方法,因此它接受实例本身作为第一个参数,当你调用 - @foo.decorate(param)
时,你试图向它传递两个参数(因为foo
是 Foo
class) 实例本身以及 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
假设我有一个 class 定义了装饰器
class Foo():
def decorate(param):
def wrapper(func):
def wrapped(*args, **kwargs):
# do something
return func(*args, **kwargs)
return wrapped
return wrapper
然后我决定在另一个 class 中调用该装饰器,如下所示:
class Bar():
foo = Foo()
param = something
@foo.decorate(param)
def func():
# do something
这引发了一个 TypeError
异常:
TypeError: decorate() takes 1 positional argument but 2 were given
我不明白这里出了什么问题。应用相同的装饰器但在相同的 class Bar
中定义工作正常,但为什么它不能在不同的 classes 上工作?
你的 decorate()
函数应该是一个实例方法,因此它接受实例本身作为第一个参数,当你调用 - @foo.decorate(param)
时,你试图向它传递两个参数(因为foo
是 Foo
class) 实例本身以及 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