【发布时间】:2018-02-02 14:24:01
【问题描述】:
我看到了允许在运行时添加基类的问题,但我有一个更具体的问题,试图通过使用元类在更深的层次结构中添加基类。
class Meta(type):
def __call__(cls, *args, special=False, **kwargs):
if special:
cls = cls.__class__(cls.__name__ + Special.__name__, (Special,), {})
return super(Meta, cls).__call__(*args, **kwargs)
class Base(metaclass=Meta):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
print('construct Base')
class Special(Base):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
print('construct Special')
class Concrete(Base):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
print('construct Concrete')
class Specific(Concrete):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
print('construct Specific')
c = Specific(special=True)
print(c.__class__.__mro__) # (Specific, Special, Base, Object)
# construct Base
# construct Special
# (<class 'SpecificSpecial'>, <class 'Special'>, <class 'Base'>, <class 'object'>)
我希望能够在元类__call__ 函数中在运行时将Special 类添加到我的层次结构中。但这将覆盖Concrete 基类,基本上将其删除。我不确定如何正确插入这个底座。此外,在尝试创建新类时,我丢失了 Specific 的构造函数。我真的只想在__mro__ 中插入一个没有副作用的类。可能吗?
【问题讨论】:
-
所以继承自
(cls, Special)或(Special, cls),而不仅仅是(Special,)?
标签: python python-3.x metaclass method-resolution-order