9

Pythonメタクラスに関する難解な質問があります。クライアント側のプロキシを介して任意のPythonクラスに簡単にアクセスできるようにするWebサーバー側のコード用のPythonパッケージを作成しています。プロキシ生成コードには、APIに含めたいすべてのPythonクラスのカタログが必要です。このカタログを作成するために、__metaclass__特別な属性を使用して、クラス作成プロセスにフックを設定しています。具体的には、「公開された」APIのすべてのクラスは、クラスの作成に関する情報を記録するように設定された特定の基本クラスをサブクラスPythonDirectPublic化します。__metaclass__

ここまでは順調ですね。複雑になるのは、自分PythonDirectPublic自身をサードパーティのクラス()から継承させたいということですenthought.traits.api.HasTraits。このサードパーティクラスを使用し__metaclass__ます。

では、2つのメタクラスを管理する正しい方法は何ですか?私のメタクラスはEnthoughtのメタクラスのサブクラスである必要がありますか?または、メタクラスのメソッド内でEnthoughtのメタクラスを呼び出して、__new__返される型オブジェクトを取得する必要がありますか?または、この特定の状況で使用する他の神秘的な呪文はありますか?

4

2 に答える 2

5

私のメタクラスは Enthought のメタクラスのサブクラスであるべきですか?

それが実際にはあなたの唯一の選択だと思います。派生クラスのメタクラスがそのすべてのベースのメタクラスのサブクラスでない場合、派生クラスを作成しようとすると Python は TypeError をスローします。したがって、メタクラスは次のPythonDirectPublicようになります

class DerivedMetaClass(BaseMetaClass):
    def __new__(cls, name, bases, dct):
        # Do your custom memory allocation here, if any

        # Now let base metaclass do its memory allocation stuff
        return BaseMetaClass.__new__(cls, name, bases, dct)

    def __init__(cls, name, bases, dct):
        # Do your custom initialization here, if any
        # This, I assume, is where your catalog creation stuff takes place

        # Now let base metaclass do its initialization stuff
        super(DerivedMetaClass, cls).__init__(name, bases, dct)

サードパーティの基本クラスのメタクラスの定義にアクセスできない場合はBaseMetaClassenthought.traits.api.HasTraits.__metaclass__. 言葉足らずですが、うまくいきます。

于 2010-07-27T19:02:16.200 に答える
1

具体的には、「公開された」API のすべてのクラスは、特定の基本クラス PythonDirectPublic をサブクラス化します。

別のメタクラスを追加するのではなく、PythonDirectPublic の結果を再帰的に使用できます。サブクラス()。

于 2011-01-28T21:16:13.707 に答える