5

Python 2.xでは、すべての新しいスタイルのクラスはobject暗黙的または明示的に継承します。次に、これを見てください:

>>> class M(type):
...     pass
...
>>> class A:
...     __metaclass__ = M
...
>>> class B:
...     pass
...
>>> a = A()
>>> b = B()
>>> type(A)
<class '__main__.M'>
>>> type(a)
<class '__main__.A'>

Aこれは、新しいスタイルのクラスという意味ですか?でもとにかくA継承しませんobjectよね?

>>> type(B)
<class 'classobj'>
>>> type(b)
<type 'instance'>

OK、Bクラシッククラスですね。

>>> isinstance(A, object)
True
>>> isinstance(B, object)
True

なぜ両方AのインスタンスとBのインスタンスがあるのobjectですか?

Bのインスタンスである場合、そうobjectではtype(B)ありませんclassobjか?

4

2 に答える 2

5

ここで読むことができるメタクラスについて:http://docs.python.org/reference/datamodel.html#customizing-class-creation。通常、メタクラスは新しいスタイルのクラスで機能することを目的としています。あなたが書くとき:

class M(type):
    pass

そしてあなたは使用します:

class C:
    __metaclass__ = M

Mが定義されているため、新しいスタイルオブジェクトを作成します(デフォルトの実装ではtype、新しいスタイルのクラスを作成するために使用されます)。を使用して古いスタイルのクラスを作成する独自のメタクラスをいつでも実装できますtypes.ClassType

于 2012-05-08T08:43:56.640 に答える
1

スロットについては、ここで読むことができますhttp://docs.python.org/release/2.5.2/ref/slots.html、フラグメント:

デフォルトでは、古いスタイルのクラスと新しいスタイルのクラスの両方のインスタンスに、属性ストレージ用のディクショナリがあります。

を追加できる新しいスタイルのクラスの場合__slots__、オブジェクトごとの辞書は作成されません。

于 2012-05-08T08:46:12.253 に答える