2011-02-05 16 views
8

私のようなPythonでクラスを定義する場合:それは継承しない、どのクラスPythonのデフォルト継承?

class AClass: 
    __slots__ = ['a', 'b', 'c'] 

objectから継承されていないようです。

+0

「オブジェクト」と古いクラスと新しいクラスの回答はすべて正しいですが、どうして尋ねますか?実用的な理由があるのか​​、それとも単なる哲学的/言語設計の問題なのか? (ほとんどの場合、問題ではないので!) –

+0

Pythonのどのバージョン? Python 2とPython 3ではこれが異なっています。 –

+0

私はこのクラスを拡張しようとしていたと思いますが、Objectから継承するまで拡張することはできません。 – Verhogen

答えて

11

クラスを定義して特定の親を宣言しない場合、そのクラスは「クラシッククラス」になります。これは、オブジェクトから継承された「新しいスタイルのクラス」とは少し異なります。詳細については、こちらを参照してください。http://docs.python.org/release/2.5.2/ref/node33.html

クラシッククラスには共通のルートがないため、基本的にAClassはどのクラスからも継承しません。

これは3.0より前のPythonバージョンに固有のことに注意してください。 Python 3では、すべてのクラスは新しいスタイルのクラスであり、他の親が宣言されていなければ暗黙的にオブジェクトから継承されます。

2

Python 2.x以前では、例AClassは「旧式」クラスです。

"new-style"クラスは定義された継承を持ち、オブジェクトまたは他のクラスから継承する必要があります。

What is the difference between old style and new style classes in Python?

EDIT:うわー、私はPython 3.xで古いスタイルの構文を使用することが可能であったとは思いませんでしたしかし、私はそれを試しただけで、その構文はまだ動作します。しかし、あなたは新しいスタイルのクラスを手に入れます。

2

試してみましょう。

>>> class AClass: 
...  pass 
... 
>>> AClass.__bases__, type(AClass) 
((), <type 'classobj'>)    # inherits from nothing 

>>> class AClass(object):    # new style inherits from object 
...  pass 
... 
>>> AClass.__bases__, type(AClass) 
((<type 'object'>,), <type 'type'>) 

他の回答に記載されているリンクの新しいスタイルクラスの紹介を読んでください。あなたが得る

<type 'classobj'> 
False 
False 

をとPython 3.1:

8

は、Python 2.7でのPython 2.7とPython 3.1

class AClass: 
    __slots__ = ['a', 'b', 'c'] 
print(type(AClass)) 
print(issubclass(AClass,object)) 
print(isinstance(AClass,type)) 

に次のコードスニペットを試してみてください、あなたが取得します。

<class type> 
True 
True 

これでそのすべてが説明されています。 objectからサブクラス化しない限り、Python 2では古いスタイルのクラスです。 Python3でのみ、デフォルトでは新しいスタイルクラスのように扱われます。