Python:我可以使用 class 级别的装饰器向装饰后的 class 添加混合吗?

Python: can I use a class-level decorator to add a mixin to the decorated class?

我想要一个装饰器,除其他外,它还可以向它正在装饰的 class 添加一个混合。 (我知道这可能是一个非常糟糕的主意,但请耐心等待。)以下几乎可行:

def add_mixin(cls):
   class inner(cls, NewMixin):
      pass
   return inner

现在如果我这样做:

@add_mixin
class foo:
   ...bunch o' stuff...

class foo 似乎工作得很好,混合了 NewMixin。(也许这个方案不会完全保留 foo 的 MRO 在脸上其他超级classes,但我不认为我关心那个。)

我发现的唯一问题是此时 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__ 未被覆盖。)

关于陷阱,我不确定。