微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Python:我可以使用类级装饰器向装饰类添加 mixin 吗?

如何解决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 举报,一经查实,本站将立刻删除。