【发布时间】:2021-04-15 15:42:50
【问题描述】:
我想要一个装饰器,除其他外,向它正在装饰的类添加一个 mixin。 (我承认这可能是一个非常糟糕的主意,但请耐心等待。)以下几乎可行:
def add_mixin(cls):
class inner(cls, NewMixin):
pass
return inner
现在如果我这样做:
@add_mixin
class foo:
...bunch o' stuff...
foo 类似乎工作得很好,混合了NewMixin。(也许这个方案在面对其他超类时不会完全保留foo 的 MRO,但我认为我不在乎那个。)
我发现的唯一问题是,此时foo.__name__ 是"inner",我希望它是"foo"!我可以通过添加来解决这个问题
inner.__name__ = cls.__name__ 在add_mixin 的定义中,这似乎涵盖了所有基础(实际上)。
问题:有没有更好的方法来做到这一点?这里还有其他我没有看到的潜伏陷阱吗?
感谢您的帮助。
【问题讨论】:
-
我不确定我是否看到使用装饰器比直接添加 mixin 的好处。它更简单,并且不会向 MRO 添加无意义的包装类。
-
您是否尝试在新类中明确修补它?
-
@chepner 我假设(希望)装饰器的目的不仅仅是只是添加 mixin,但添加 mixin 是与问题。
-
“在其他东西中”可能是让这个问题变得有趣的原因。
标签: python decorator superclass