如何从顶级类范围内访问类值?我的意思是,你怎么做:
class FooClass(object):
zeroith_base = __bases__[0]
.
.
.
在这种情况下,我特别想要做的是派生所有基类的元类,以动态生成一个元类,该元类将所有基类的元类子类化,以获得过去的元类冲突问题。我找到了http://code.activestate.com/recipes/204197-solving-the-metaclass-conflict/,虽然所有的概念对我来说都很有意义,但是配方的实际代码超出了我的能力。我不想使用我无法理解的代码,所以相反,我试图实现我自己的,更基本的系统,但是我被困在正方形试图在创建期间检查类对象。
答案 0 :(得分:1)
您会发现__bases__
不是类名称空间的一部分。类命名空间作为第三个参数传递给元类;基数作为第二个参数传递。在创建课程之前,它们是完全分开的。
所以你需要做的是编写一个元类来合成你想要的元类,然后用它来创建类。我不知道这是否真的有效,但我看不出有什么理由不这样做。
答案 1 :(得分:1)
您无法在创建类之前检查它,并且在语句套件或类主体完成执行之前尚未创建它。第一次访问此信息时,将在创建相关类的类的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'>"