【发布时间】:2016-08-22 16:11:11
【问题描述】:
我知道我可以使用闭包和继承来创建一个改变类的装饰器。
def wrapper(cls, *args, **kwargs):
class Wrapped(cls):
"""Modify your class here."""
return Wrapped
但如果我需要测试我的新类以了解它们是否继承Wrapped,我无法访问Wrapped 本身来进行简单的isinstance 或issubclass 测试。
另一方面,直接继承不是一种选择。我有大约 10 个不同的包装器需要添加到一个类中。这对层次结构树的负担太大了。
所以我需要一种从外部访问闭包的方法。或者另一种构建装饰器的方法。
【问题讨论】:
-
“但我需要测试我的新类以了解它们是否继承
Wrapped”——我不确定为什么您需要对其进行测试。为什么不测试它们的行为是否正确?另请注意,装饰类将是Wrapped,因此如果您真的想要,可以测试DecoratedClass.__name__ == 'Wrapped',但这充其量只是一种黑客攻击。 -
您的包装器可以添加某种标记方法吗?您可以测试标签是否存在。
-
如果我有很多
wrapped对象,则不能选择测试名称。你的意思是try访问修改和catch任何错误? -
@John 这可能是一个选择。
-
@Claudiu 的出色回答正是我想到的。
标签: python decorator python-decorators