Python クラスがオブジェクトを継承するのはなぜですか? 質問する

Python クラスがオブジェクトを継承するのはなぜですか? 質問する

次のクラス宣言が から継承するのはなぜですかobject?

class MyClass(object):
    ...

ベストアンサー1

クラス宣言が を継承する理由はありますかobject?

Python 3 では、Python 2 と 3 の互換性以外に理由はありません。Python 2 では、多くの理由があります


Python 2.x のストーリー:

objectPython 2.x (2.2 以降) では、基本クラスとしての有無に応じて 2 つのスタイルのクラスがあります。

  1. 「クラシック」スタイルのobjectクラス:基本クラスとして次のものはありません:

    >>> class ClassicSpam:      # no base class
    ...     pass
    >>> ClassicSpam.__bases__
    ()
    
  2. 「新しい」スタイルのクラス: 直接的または間接的に(例えば、ビルトインタイプ) を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'>,)
    

間違いなく、クラスを作成するときは常に新しいスタイルのクラスを選択することをお勧めします。そうすることで得られるメリットは数多くありますが、そのいくつかを挙げると次のようになります。

  • 記述子のサポート具体的には、記述子によって次の構成が可能になります。

    1. classmethod: インスタンスではなく、暗黙的な引数としてクラスを受け取るメソッド。
    2. staticmethodself: 暗黙の引数を最初の引数として受け取らないメソッド。
    3. プロパティproperty: 属性の取得、設定、削除を管理するための関数を作成します。
    4. __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 がバックグラウンドで挿入するため、実際には違いはありません。

おすすめ記事