装饰 class 在 Python 的方法签名中没有 self
Decorate class that has no self in method signature in Python
我正在尝试将装饰器动态应用到 classes。
如果我有一个 class 方法,它会在方法签名中包含 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 class 方法签名,以便它可以在不将自己作为签名的一部分的情况下工作?
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 在调用方法时将对象实例作为第一个参数传递。因此,如果您定义一个没有参数的方法,您将获得执行。给定的第一个参数是您的 "dude" 对象。
更多信息请见https://docs.python.org/2/tutorial/classes.html#method-objects
要在没有 self
或 cls
参数的情况下调用您的 test()
方法,您需要将其设为 staticmethod
.
class Dude:
@staticmethod
def test():
pass
然后您还需要更新 debugclass
以包装 staticmethod
对象,因为它们不是可调用对象。不幸的是,您需要一种不同的方式来包装 staticmethod 对象:
def debugclass(cls):
# cls is a class
for key, val in vars(cls).items():
if callable(val):
setattr(cls, key, debug(val))
elif isinstance(val, staticmethod):
setattr(cls, key, staticmethod(debug(val.__func__)))
return cls
>>> class Dude:
def test(self):
pass
@staticmethod
def test1():
pass
>>> debugclass(Dude)
<class __main__.Dude at 0x7ff731842f58>
>>> Dude().test()
awesome
>>> Dude.test1()
awesome
我正在尝试将装饰器动态应用到 classes。 如果我有一个 class 方法,它会在方法签名中包含 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 class 方法签名,以便它可以在不将自己作为签名的一部分的情况下工作?
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 在调用方法时将对象实例作为第一个参数传递。因此,如果您定义一个没有参数的方法,您将获得执行。给定的第一个参数是您的 "dude" 对象。
更多信息请见https://docs.python.org/2/tutorial/classes.html#method-objects
要在没有 self
或 cls
参数的情况下调用您的 test()
方法,您需要将其设为 staticmethod
.
class Dude:
@staticmethod
def test():
pass
然后您还需要更新 debugclass
以包装 staticmethod
对象,因为它们不是可调用对象。不幸的是,您需要一种不同的方式来包装 staticmethod 对象:
def debugclass(cls):
# cls is a class
for key, val in vars(cls).items():
if callable(val):
setattr(cls, key, debug(val))
elif isinstance(val, staticmethod):
setattr(cls, key, staticmethod(debug(val.__func__)))
return cls
>>> class Dude:
def test(self):
pass
@staticmethod
def test1():
pass
>>> debugclass(Dude)
<class __main__.Dude at 0x7ff731842f58>
>>> Dude().test()
awesome
>>> Dude.test1()
awesome