Python 如何编写适当的修饰符来修改类

Python 如何编写适当的修饰符来修改类,python,decorator,python-decorators,Python,Decorator,Python Decorators,我知道我可以使用闭包和继承来创建修改类的装饰器 def wrapper(cls, *args, **kwargs): class Wrapped(cls): """Modify your class here.""" return Wrapped 但是,如果我需要测试我的新类以了解它们是否继承了Wrapped,我就无法访问Wrapped本身来执行简单的isinstance或issubclass测试 另一方面,直接继承不是一种选择。我有大约10个不同的包装器,需

我知道我可以使用闭包和继承来创建修改类的装饰器

def wrapper(cls, *args, **kwargs):
    class Wrapped(cls):
        """Modify your class here."""

    return Wrapped
但是,如果我需要测试我的新类以了解它们是否继承了
Wrapped
,我就无法访问
Wrapped
本身来执行简单的
isinstance
issubclass
测试

另一方面,直接继承不是一种选择。我有大约10个不同的包装器,需要添加到一个类中。这给层次结构树带来了太多的负担


所以我需要一种从外面进入的方法。或者另一种构建decorator的方法。

听起来您想检查一个类是否已被这个特定的decorator包装。最有效的方法可能是添加一个字段,即:

def wrapper(cls, *args, **kwargs):
    class Wrapped(cls):
        """Modify your class here."""

    Wrapped._is_wrapped_by_this_wrapper = True
    return Wrapped
然后,您可以检查
hasattr
getattr
。\u此包装器是否已包装


如果您有多个包装器类可以相互协作,您可能会想出一个更好地协同工作的解决方案,例如,可能是一个由已应用的包装器的所有名称组成的
集。

您可以从两个类继承,一个基类和
cls

class WrapperBase:
    pass

def wrapper(cls, *args, **kwargs):
    class Wrapped(cls, WrapperBase):
        """Modify your class here."""

    return Wrapped
现在生成的类的所有实例都测试
True
isinstance(obj,WrapperBase)


请注意,
WrapperBase
对在MRO中查找继承的方法没有影响;它在任何层次结构中都排在最后(在Python2上,不是从
对象继承的
将它放在MRO的最后,在Python3中,它将位于
对象
和包装类的MRO中
对象
之前的任何对象之间。

“但是我需要测试我的新类,以知道它们是否继承
包装的
”--我不知道你为什么需要测试它。为什么不测试它们的行为是否正常?还要注意,修饰类将被
包装
,这样你就可以测试
修饰类了。如果你真的想,你可以用name\uuuuuuuu=='Wrapped'
,但这充其量感觉像是一个黑客。你的包装器能添加某种标记方法吗?你可以测试一下e标签的存在。如果我有许多
包装的
对象,测试名称不是一个选项。你的意思是只
尝试
访问修改并
捕获
任何错误吗?@John这可能是一个选项。@Claudiu的优秀答案是我想到的那种事情。但是,然后我输入MRO冲突。当我需要进入继承树。我想到了
\uuu init\uuu
。@AlexandreParent:
WrapperBase
没有定义任何方法。
super()
在查找
\uuuu init\uuuu
和其他方法时,WrapperBase不会有问题。反正它排在最后。很有趣。它会解决我的问题。