如何解决Python:我可以使用类级装饰器向装饰类添加 mixin 吗?
我想要一个装饰器,除其他外,它向它正在装饰的类添加一个 mixin。 (我意识到这可能是一个非常糟糕的主意,但请耐心等待。)以下几乎有效:
def add_mixin(cls):
class inner(cls,NewMixin):
pass
return inner
现在如果我这样做:
@add_mixin
class foo:
...bunch o' stuff...
class foo
似乎工作得很好,混合了 NewMixin
。(也许这个方案在面对其他超类时不会完全保留 foo
的 MRO,但我不认为我不在乎那个。)
我发现的唯一问题是此时 foo.__name__
是 "inner"
而我希望它是 "foo"
!我可以通过添加来解决这个问题
inner.__name__ = cls.__name__
在 add_mixin
的定义中,这似乎涵盖了所有的基础(实际上)。
问题:有没有更好的方法来做到这一点?这里还有其他我没有看到的潜在陷阱吗?
感谢您的帮助。
解决方法
编辑:我在写答案时编辑了这个问题以提及这种方法。
你可以这样做:
def add_mixin(cls):
class inner(cls,NewMixin):
pass
inner.__name__ = cls.__name__
return inner
然后:
@add_mixin
class foo:
pass
@add_mixin
class bar:
pass
f = foo
print(f.__name__)
b = bar
print(b.__name__)
print(f.__name__)
给予
foo
bar
foo
(在引用 bar 后再次打印 foo 以证明 __name__ 未被覆盖。)
就陷阱而言,我不确定。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。