gpt4 book ai didi

python - 在Python中装饰方法签名中没有self的类

转载 作者:行者123 更新时间:2023-11-30 23:01:38 24 4
gpt4 key购买 nike

我正在尝试将装饰器动态应用于类。如果我有一个在方法签名中包含 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)

最佳答案

为了使您的 test() 方法可以在没有 selfcls 参数的情况下调用,您需要将其设为 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

关于python - 在Python中装饰方法签名中没有self的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34853120/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com