1. ホーム
  2. python

[解決済み] Pythonのクラスはなぜオブジェクトを継承するのですか?

2022-03-16 05:36:04

質問

を継承するクラス宣言は、何か理由があるのでしょうか? object ?

これを行うコードを見つけたのですが、その理由がわかりません。

class MyClass(object):
    # class code follows...

解決方法は?

<ブロッククオート

を継承するクラス宣言は、何か理由があるのでしょうか? object ?

Python 3では、Python 2と3の間の互換性は別として。 理由なし . Python 2の場合。 多くの理由 .


Python 2.xの話。

Python 2.x (2.2以降) では、クラスには object をベースクラスとします。

  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'>,)
    
    

間違いなく、クラスを書くときは 常に 新しいスタイルのクラスにしたい。そうすることで得られる特典は数多くありますが、そのいくつかを挙げてみましょう。

を継承していない場合は object は忘れてください。前出の箇条書きと "new"スタイル クラスの他の特典について、より詳細な説明を以下に示します。 こちら .

新スタイルのクラスの欠点は、クラス自体のメモリ消費量が増えることです。多くのクラスオブジェクトを作成しない限り、これが問題になるとは思えませんし、プラスの海に沈むマイナスではありますが。


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で。 を継承しています。 object Pythonに依存しないコードを書いている場合、つまり、Python 2とPython 3の両方で動作する必要がある場合です。そうでなければ、Pythonが裏で挿入してくれるから、違いはないんだ。