【发布时间】:2016-04-23 12:42:00
【问题描述】:
我正在尝试将装饰器动态应用于类。 如果我有一个在方法签名中包含 self 的类方法,它就可以工作。
工作示例:
from functools import wraps
def debug(func):
@wraps(func)
def wrapper(*args, **kwargs):
print('awesome')
f = func(*args, **kwargs)
return f
return wrapper
def debugclass(cls):
# cls is a class
for key, val in vars(cls).items():
if callable(val):
setattr(cls, key, debug(val))
return cls
class Dude:
def test(self):
#def test(): # this does not work
pass
debugclass(Dude)
dude = Dude()
dude.test()
如何更改 Dude 类方法签名,使其在 self 不参与签名的情况下也能正常工作?
class Dude:
def test(): # without self
pass
debugclass(Dude)
dude = Dude()
dude.test()
出现错误:
Traceback (most recent call last):
File "withoutself.py", line 33, in <module>
dude.test()
File "withoutself.py", line 7, in wrapper
f = func(*args, **kwargs)
TypeError: test() takes no arguments (1 given)
【问题讨论】:
标签: python metaprogramming python-decorators