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

标签 python metaprogramming python-decorators

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

相关文章:

python - Pygame,livewires : Attribute error: Message object has no attribute 'handle collide'

用于 C 输出的 Javascript 代码生成器?

python - 将 abc.abstractmethod 与其他装饰器相结合

python - 了解 Pytorch 网格示例

python - 如何使用 Python 将文件格式从 Unicode 转换为 ASCII?

python - 在Elasticsearch中可能存在或不存在字段的情况下如何搜索

c++ - 使用元编程展开嵌套循环

c++ - 在一系列成员变量上调用运算符

python - 有没有比使用装饰器在不编辑函数的情况下记录输出更好的方法?

python - 函数装饰器未被调用