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__ 未被覆盖。)
关于陷阱,我不确定。
我想要一个装饰器,除其他外,它还可以向它正在装饰的 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__ 未被覆盖。)
关于陷阱,我不确定。