すべての Python ビルトインは のサブクラスでobject
あり、多くのユーザー定義クラスも同様です。なんで?クラスの目的は何object
ですか?ただの空のクラスですよね?
6 に答える
つまり、魔法のポニーを解放します。
長い間、Python 2.2 以前は「古いスタイルのクラス」を使用していました。これらはクラスの特定の実装であり、いくつかの制限がありました (たとえば、組み込み型をサブクラス化することはできません)。これに対する修正は、クラスの新しいスタイルを作成することでした。ただし、これを行うと、下位互換性のない変更がいくつか含まれます。そのため、古いスタイルのクラス用に記述されたコードが引き続き機能することを確認するためにobject
、クラスはすべての新しいスタイルのクラスのスーパークラスとして機能するように作成されました。そのため、Python 2.X ではclass Foo: pass
、古いスタイルのクラスclass Foo(object): pass
を作成し、新しいスタイルのクラスを作成します。
詳しくは、Guido のUnifying types and classes in Python 2.2 を参照してください。
そして、一般に、すべてのクラスを新しいスタイルにする習慣を身につけるのは良い考え@property
です。古いスタイルのクラスでは機能しないもの (デコレータが思い浮かびます) があるからです。
短い答え: サブクラス化object
により、効果的に新しいスタイルのクラスになります (Python 3.x では自動であるため、これは不要であることに注意してください)。
new style
クラスとクラスの違いについては、このスタックオーバーフローの質問old style
を参照してください。完全なストーリーについては、Python の型とオブジェクトに関するこの素晴らしい記事を参照してください。
それはクラスの「新しいスタイル」に関係しています。ここで詳細を読むことができます: http://docs.python.org/tutorial/classes.html#multiple-inheritanceおよびここでも: http://docs.python.org/reference/datamodel.html#new-style -and-classic-classes
新しいスタイルのクラスを使用すると、「__slots__、記述子、プロパティ、および __getattribute__() などの Python の新しい多目的機能」を使用できるようになります。
そうです、しかしそれはクラスを新しいスタイルのクラスとしてマークします。新しく開発されたクラスはobject
ベースを使用する必要があります。コストがほとんどかからず、コードの将来性が保証されるからです。
簡単に言うと、スーパークラスを必要としない従来のクラスには、多くの古いコードを壊さない限り回避できない制限がありました。そのため、彼らは からサブクラス化する新しいスタイルのクラスの概念を作成し、object
プロパティの定義などのクールなことを実行できるようになり、サブクラス化dict
はもはや苦痛や奇妙なバグの練習ではなくなりました。
詳細は、Python ドキュメントのセクション 3.3: New-style and classic classes にあります。
Python 2.2 では、オブジェクトをサブクラス化しない古いスタイル クラスに関連する多くの追加機能を持つ「新しいスタイル クラス」が導入されました。Subclasses オブジェクトは、クラスが古いスタイルのクラスではなく、新しいスタイルのクラスであることを示すために選択された方法です。