擅长:python、mysql、java
<p>您可以在类创建后更改元类,就像更改对象的类一样,但是您会遇到很多问题。首先,初始元类需要与新元类的<code>type</code>不同,不会调用新元类的<code>__init__</code>和<code>__new__</code>(尽管您可以手动调用<code>__init__</code>或执行<code>__init__</code>作业的方法)。</p>
<p>更改元类最不麻烦的方法可能是从头重新创建类:</p>
<pre><code>B = MetaClass(B.__name__, B.__bases__, B.__dict__)
</code></pre>
<p>但如果坚持动态更改元类,则首先需要使用临时自定义元类定义B:</p>
<pre><code>class _TempMetaclass(type):
pass
class B:
__metaclass__ = _TempMetaclass # or: type('temp', (type, ), {})
</code></pre>
<p>然后您可以这样定义元类:</p>
<pre><code>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
</code></pre>
<p>然后做如下事情:</p>
<pre><code>B.__class__ = MetaClass
MetaClass._actual_init(B, B.__name__, B.__bases__, B.__dict__)
</code></pre>
<p>您还需要确保类的所有初始化都已完成<code>_actual_init</code>。您还可以向为您更改元类的元类添加<code>classmethod</code>。</p>
<p>这两种解决方案都有一个小缺点,即B的基是有限的,它们需要与原始元类和新元类兼容,但我想这在您的情况下不是问题。</p>