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不会有问题。反正它排在最后。很有趣。它会解决我的问题。