0

「person.Person.」と呼べるようにしたいです。class ' を呼び出して、'class person.Person' を返します。これは、person オブジェクトの場合と同様です。

>>> p = person.Person()
>>> p.__class__
<class 'person.Person'>
>>> person.Person.__class__
<class 'perframe.datatype.TypeSystemMeta'>

これが Person 継承ツリーです...

class TypeSystem(object):
    __metaclass__ = TypeSystemMeta    

class Model(TypeSystem):
    pass    

class Node(Vertex,Model):
    pass

class Person(Node):
    pass

何が起きてる?

4

3 に答える 3

5

Python では、クラスでさえオブジェクトであり、すべてのオブジェクトはクラスのインスタンスです。Personのインスタンスである「クラス オブジェクト」を参照しますtype。この場合、劇中のメタクラスがあります - 非常に紛らわしいメタプログラミングの魔法ですが、紹介が必要な場合は、 Python のメタクラスとは何ですか? を参照してください。. class Foo(object),を宣言した場合Foo.__class__ is type(オブジェクトから継承しない古いスタイルのクラスでは状況が異なり、より混乱します)。ちなみに、これtypeはそれ自体のインスタンスのように見えるという点で、さらに奇妙につながります。

于 2011-06-04T14:56:27.723 に答える
2

person.Person への参照を使用するだけです。

>>> p = person.Person() 
>>> p.__class__ 
<class 'person.Person'> 
>>> person.Person
<class 'person.Person'> 

Python の型システムに関する非常に役立つリソースは、バージョン 2.2 以降の Python の型システムの原案です。

http://www.python.org/download/releases/2.2/descrintro/

于 2011-06-04T14:49:13.763 に答える
1

実行した結果が得られる理由を理解するには、メタクラスとは何かを理解する必要があります。それを理解するには、Python でクラスがどのように作成されるかを理解する必要があります。

ステートメントを記述するclassと、インタープリターは新しい名前空間を開き、ステートメント内のコードを実行し、そのコードの実行後に名前空間の状態を確認します。次に、重要な詳細 (ローカル変数、クラスの名前など) を計算し、それを組み込みの class に渡しtypeます。したがって、のインスタンスtypeは通常クラスと呼ばれるものでtypeあり、「メタクラス」でもあります。

メタクラスをオーバーライドするとtype、新しいクラスの作成に使用しないように Python に指示します。代わりに、同じものをカスタム クラスに渡します。これにより、 のデフォルトをオーバーライドできますtype

したがって、person.Personいくつかの引数をメタクラスに渡すことによって作成されました。特に、それはそのクラスのインスタンスなので__class__、メタクラスです!

于 2011-06-04T14:58:06.700 に答える