您可以在创建类之后更改元类,就像更改对象的类一样,但是会遇到很多问题。对于初学者,初始元类必须与type
,__init__
以及__new__
新元类的和都不会被调用(尽管您可以手动调用__init__
或执行__init__
s的方法 )。
B = MetaClass(B.__name__, B.__bases__, B.__dict__)
但是,如果您坚持动态更改元类,则首先需要使用临时自定义元类定义B:
class _TempMetaclass(type):
pass
class B:
__Metaclass__ = _TempMetaclass # or: type('temp', (type, ), {})
然后,您可以像这样定义元类:
class MetaClass(type):
def __init__(cls, *a, **kw):
super(MetaClass, cls).__init__(*a, **kw)
cls._actual_init(*a, **kw)
def _actual_init(cls, *a, **kw):
# actual initialization goes here
然后执行以下操作:
B.__class__ = MetaClass
MetaClass._actual_init(B, B.__name__, B.__bases__, B.__dict__)