您无法在创建类之前对其进行检查,并且在语句套件或类主体完成执行之前尚未创建它。您第一次访问此信息将是在MetaClass.__new__
创建相关类的类的方法中,或在创建相关类的事物的执行中,从技术上讲,它们根本不需要是元类或类(如下例所示)。
这是一个非常粗略的原型,它可能不适用于所有情况,但适用于简单的情况,并且可能比配方更容易遵循。
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'>"