python - 可以用装饰器劫持类定义吗?

标签 python decorator

假设我有一个

class A:
    def __init__(self, *args):
        pass

我想要一个装饰器来复制A的定义并用新类扩展它。

def decorator(cls): # some decorator here
    # make a new class which inherits from A
    # return it while preserving the original A

这可能吗? (PS:这是为了避免维护问题。)

最佳答案

当您使用装饰器语法调用函数时:

@my_decorator_function
class A:
    pass

装饰器函数的返回值将替换A的现有定义。 。因此,如果您希望它创建一个新类并“在保留原始 A 的同时返回它”,那么您将面临一个棘手的挑战。你什么return将取代A ,所以你需要决定这是否应该是原始的 A或新类(class)。您可以将另一个放在其他地方。

例如,此装饰器将替换 A带有子类,子类将使原始 A class 可用作名为 _orig 的类属性:

def class_decorator(cls):
    class SubClass(cls):
        _orig = cls
        # add other stuff here?
    return SubClass

您可以添加额外的逻辑来复制原始类的 __name____doc__如果你愿意的话,可以进入新类(class)。您还可以扭转逻辑,并添加 SubClass作为 cls 的属性在返回未修改的 cls 之前.

关于python - 可以用装饰器劫持类定义吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45450740/

相关文章:

python - 新文件的 S3 铲斗传感器

java - 装饰图案钢琴应用

python - 在 python 中发现装饰类实例方法

c++ - C++中装饰器模式的多态应用与耦合问题

python - Django self.cleaned_data Keyerror

python - 避免使用mock.patch将第二个参数传递给每个单元测试

python - Django:包含 Unicode 字符的电子邮件附件中的 CSV 会导致额外的换行符

python - matplotlib 图形的选项卡式窗口,这可能吗?

python - 装饰器将实例方法转换为类函数

python - 如何自动将类装饰器应用于所有子类?