26

違いは何ですか:

class ClassName(object):
    pass

class ClassName:
    pass

これらのクラスのモジュールのヘルプ関数を呼び出すと、ヘルプ____builtin____.objectのクラス タイトルのすぐ下に最初のケースが表示されます。2 番目のケースでは、クラス名のみが表示されます。これらのクラスおよび/またはその可能なメソッドの間に機能的な違いはありますか?

(私はそれclass Classname(ParentClassName)が機能的な用途を持っていることを知っています)

4

2 に答える 2

22

Python 2.x では、「オブジェクト」から継承すると、クラスは「新しいスタイル」のクラスになります。これは、Python 2.2 (2001 年頃) で実装されました。「オブジェクト」から継承しない場合は、「古いスタイル」のクラスが作成されます。 、実際には下位互換性のためにのみ維持されていました。

「新しいスタイル」クラスの大きな利点は、Python 全体で型が統一されることです。それ以前は、int、list、dict などの組み込み型を適切にサブクラス化できませんでした。オブジェクトの属性を取得および設定するためのプロトコルを記述する「記述子プロトコル」も指定されており、言語に多くの柔軟性を与えています。(クラスで Python の「プロパティ」を使用すると、より顕著になります)。

違いを生むのは、実際には「オブジェクトから継承する」ことではありませんが、Python のクラスはオブジェクトでもあるため、クラスのクラス自体が変更されます (クラスのクラスは「メタクラス」として知られています)。したがって、メタクラスを「タイプ」に設定すると、オブジェクトから継承して新しいスタイル クラスを作成する必要がなくなります。

Python 2.x では、すべてのクラスを新しいスタイルにすることを強くお勧めします。古いスタイルのクラスを使用すると、単一の簡単なケースではうまくいくかもしれませんが、使用しようとすると、微妙で見つけにくいエラーが多数生成される可能性があります。プロパティ、ピクル、記述子、およびその他の高度な機能。とりわけ、オブジェクトの「タイプ」をチェックしようとすると、異なるユーザー定義クラスのオブジェクトであっても、古いスタイル クラスのすべてのオブジェクトで同じ (タイプ「インスタンス」) になります。

Python バージョン 3.x では、すべてのクラスが新しいスタイルです。メタクラスを設定する必要はありません。

Python のドキュメント「データモデル」は「法の書」であり、両方のクラス typ の動作が詳細に定義されています (言語を再実装するのに十分です)。

http://docs.python.org/reference/datamodel.html

Guido のこのブログ投稿では、新しいスタイル クラスの背後にある動機について、より軽い言葉で説明しています。

http://python-history.blogspot.com.br/2010/06/new-style-classes.html

http://docs.python.org/release/2.5.2/ref/node33.html

于 2012-04-06T13:27:31.573 に答える
7

ClassName(object)新しいスタイル クラスを使用します: http://docs.python.org/release/2.5.2/ref/node33.html

2 番目の例は、古いスタイルのクラスを示しています。

Python 3 では、新しいスタイル クラスがデフォルトで使用され、サブクラス化する必要がなくなりましたobject

于 2012-04-06T13:15:27.270 に答える