0

如何从顶级类范围内访问类值?我的意思是,您如何执行以下操作:

class FooClass(object):
    zeroith_base = __bases__[0]
    .
    .
    .

在这种情况下,我特别想做的是派生所有基类的元类以动态生成一个元类,该元类对所有基类的元类进行子类化,以解决元类冲突问题。我找到了http://code.activestate.com/recipes/204197-solving-the-metaclass-conflict/,虽然所有的概念对我来说都有意义,但食谱的实际代码超出了我的理解能力。我不想使用我无法理解的代码,所以相反,我尝试实现我自己的、更基本的系统,但我被困在第一阶段,试图在创建过程中检查类对象。

4

2 回答 2

1

你会发现它__bases__不是类命名空间的一部分。类命名空间作为第三个参数传递给元类;基数作为第二个参数传递。在创建类之前,它们是完全分开的。

所以你需要做的是编写一个合成你想要的元类的元类,然后使用它来创建类。我不知道这是否真的有效,但我看不出有什么理由不这样做。

于 2012-05-25T14:02:10.657 回答
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'>"
于 2012-05-25T14:31:01.157 回答