次のクラス宣言が から継承するのはなぜですかobject
?
class MyClass(object):
...
ベストアンサー1
クラス宣言が を継承する理由はありますか
object
?
Python 3 では、Python 2 と 3 の互換性以外に理由はありません。Python 2 では、多くの理由があります。
Python 2.x のストーリー:
object
Python 2.x (2.2 以降) では、基本クラスとしての有無に応じて 2 つのスタイルのクラスがあります。
「クラシック」スタイルの
object
クラス:基本クラスとして次のものはありません:>>> class ClassicSpam: # no base class ... pass >>> ClassicSpam.__bases__ ()
「新しい」スタイルのクラス: 直接的または間接的に(例えば、ビルトインタイプ) を
object
基本クラスとして定義します。>>> class NewSpam(object): # directly inherit from object ... pass >>> NewSpam.__bases__ (<type 'object'>,) >>> class IntSpam(int): # indirectly inherit from object... ... pass >>> IntSpam.__bases__ (<type 'int'>,) >>> IntSpam.__bases__[0].__bases__ # ... because int inherits from object (<type 'object'>,)
間違いなく、クラスを作成するときは常に新しいスタイルのクラスを選択することをお勧めします。そうすることで得られるメリットは数多くありますが、そのいくつかを挙げると次のようになります。
記述子のサポート具体的には、記述子によって次の構成が可能になります。
classmethod
: インスタンスではなく、暗黙的な引数としてクラスを受け取るメソッド。staticmethod
self
: 暗黙の引数を最初の引数として受け取らないメソッド。- プロパティ
property
: 属性の取得、設定、削除を管理するための関数を作成します。 __slots__
: クラスのメモリ消費を節約し、属性へのアクセスも高速化します。もちろん、制限を課す。
の
__new__
静的メソッド: 新しいクラスインスタンスの作成方法をカスタマイズできます。メソッド解決命令 (MRO): どのメソッドを呼び出すかを解決しようとするときに、クラスの基本クラスがどの順序で検索されるか。
MROに関連して、
super
通話. また、以下も参照してください。super()
スーパーだと考えられています。
を継承しない場合はobject
、これらを忘れてください。以前の箇条書きのより詳細な説明と「新しい」スタイルのクラスのその他の特典については、ここ。
新しいスタイルのクラスの欠点の 1 つは、クラス自体がより多くのメモリを必要とすることです。ただし、クラス オブジェクトを多数作成しない限り、これが問題になるとは思えません。これは、多くの利点の中に埋もれたマイナス面です。
Python 3.x のストーリー:
Python 3 では、物事は簡素化されています。新しいスタイルのクラス (単にクラスと呼ばれます) のみが存在するため、追加する場合の唯一の違いは、object
さらに 8 文字を入力する必要があることです。これは次のようになります。
class ClassicSpam:
pass
これは、(名前を除けば)これと完全に同等です:
class NewSpam(object):
pass
そしてこうなります:
class Spam():
pass
誰もがobject
を持っています__bases__
。
>>> [object in cls.__bases__ for cls in {Spam, NewSpam, ClassicSpam}]
[True, True, True]
それで、あなたは何をすべきでしょうか?
Python 2 の場合: 常にobject
明示的に を継承します。特典を取得します。
Python 3 の場合: Python に依存しないコード (つまり、Python 2 と Python 3 の両方で動作する必要があるコード) を記述する場合は、継承しますobject
。それ以外の場合は継承しないでください。Python がバックグラウンドで挿入するため、実際には違いはありません。