2012-05-08 11 views
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 

はなぜobjectの両方ABインスタンスのインスタンスでありますか?

objectのインスタンスの場合、type(B)classobjになりません。

+4

何かがオブジェクトです! – orlp

+0

この質問に '__slots__'を置いてはいけません。それはまったく別の質問です。 –

+0

@ChrisMorgan、はい、私はそれを実現しました。 – Alcott

答えて

5

ここで読むことができるメタクラスについて:http://docs.python.org/reference/datamodel.html#customizing-class-creation。一般に、メタクラスは新しいスタイルクラスで動作するように意図されています。あなたが書くとき:

class M(type): 
    pass 

、あなたが使用します。

class C: 
    __metaclass__ = M 

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

1

スロットについて、あなたは、ここにhttp://docs.python.org/release/2.5.2/ref/slots.htmlの断片を読むことができる:

デフォルトでは、新旧両方のスタイルクラスのインスタンスは、属性記憶のための辞書を持っています。

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

関連する問題