0

トップレベルのクラススコープ内からクラス値にアクセスするにはどうすればよいですか? つまり、次のようなことをどのように行うかということです。

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

この場合、私が具体的にやろうとしているのは、すべての基本クラスのメタクラスを派生させて、すべての基本クラスのメタクラスをサブクラス化するメタクラスを動的に生成し、metclass の競合の問題を解決することです。http://code.activestate.com/recipes/204197-solving-the-metaclass-conflict/を見つけました。すべての概念は理解できますが、レシピの実際のコードは、それに従う能力を超えています。理解できないコードを使用したくないので、代わりに独自のより初歩的なシステムを実装しようとしましたが、作成中にクラスオブジェクトを検査しようとして四角で立ち往生しています。

4

2 に答える 2

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 に答える
1

__bases__クラスの名前空間の一部ではないことがわかります。クラスの名前空間は、3 番目のパラメーターとしてメタクラスに渡されます。塩基は2 番目のパラメーターとして渡されます。クラスが作成されるまで、それらは完全に分離されています。

したがって、必要なメタクラスを合成するメタクラスを作成し、それを使用してクラスを作成する必要があります。それが実際に機能するかどうかはわかりませんが、機能しない理由はわかりません。

于 2012-05-25T14:02:10.657 に答える