擅长:python、mysql、java
<p>您不能在类创建之前检查它,并且在语句套件或类主体完成执行之前它还没有被创建。您第一次能够访问这些信息是在创建有问题的类的类的<code>MetaClass.__new__</code>方法中,或者是在创建有问题的类的事物的执行中,从技术上讲,它们根本不需要是元类或类(如下例所示)。你知道吗</p>
<p>这是一个非常粗略的原型,可能并不适用于所有情况,但适用于简单的情况,可能比配方更容易遵循。你知道吗</p>
<pre><code>def meta_class_synthesize(name, bases, attrmap):
seen = set()
seen_add = seen.add
metas = [type(base) for base in bases]
metas = tuple([
meta for meta in metas
if meta is not type and meta not in seen and not seen_add(meta)])
if not metas:
return type(name, bases, attrmap)
elif len(metas) == 1:
return metas[0](name, bases, attrmap)
newmeta_name = "__".join(meta.__name__ for meta in metas)
newmeta = type(newmeta_name, metas, {})
return newmeta(name, bases, attrmap)
class M_A(type):
pass
class M_B(type):
pass
class A:
__metaclass__ = M_A
class B:
__metaclass__ = M_B
class C(A, B):
__metaclass__ = meta_class_synthesize
print type(C) # prints "<class '__main__.M_A__M_B'>"
</code></pre>