web-dev-qa-db-ja.com

Pythonでクラス「オブジェクト」をサブクラス化する目的は何ですか?

すべてのPython組み込みはobjectのサブクラスであり、私も多くのユーザー定義クラスに出くわしています。なぜですか?クラスの目的は何ですかobject?空のクラスですよね?

52
ignoramus

要するに、それは無料の魔法のポニーを設定します。

長い間、Python 2.2以前は「古いスタイルのクラス」を使用していました。これらはクラスの特定の実装であり、いくつかの制限がありました(たとえば、組み込み型をサブクラス化できませんでした)。この問題の修正は、新しいスタイルのクラスを作成することでした。ただし、これを行うと、下位互換性のない変更が行われる可能性があります。そのため、古いスタイルのクラス用に作成されたコードが引き続き機能することを確認するには、objectクラスはすべての新しいスタイルのクラスのスーパークラスとして機能するように作成されています。したがって、Python 2.Xでは、_class Foo: pass_は古いスタイルのクラスを作成し、class Foo(object): pass新しいスタイルクラスを作成します。

詳細については、Guidoの Python 2.2 の型とクラスの統合を参照してください。

そして、一般的に、すべてのクラスを新しいスタイルにする習慣を身につけることをお勧めします。古いスタイルのクラスでは機能しないものもあるためです(_@property_デコレータが思い浮かびます)。 。

52
David Wolever

簡単な答え:objectをサブクラス化すると、事実上new-styleクラスになります(Python 3.x)

new styleクラスとold styleクラスの違いについては、 このスタックオーバーフローの質問 を参照してください。完全なストーリーについては、 このPythonタイプとオブジェクト)の素敵な記事 を参照してください。

7
ChristopheD

それはクラスの「新しいスタイル」と関係があります。詳細については、こちらをご覧ください: http://docs.python.org/tutorial/classes.html#multiple-inheritance およびこちら: http://docs.python。 org/reference/datamodel.html#new-style-and-classic-classes

新しいスタイルのクラスを使用すると、「__ slots__、記述子、プロパティ、__ getattribute __()などのPythonの新しい多用途の機能」を使用できるようになります。

4
thetaiko

そうですが、クラスを new-style クラスとしてマークします。新しく開発したクラスはobjectベースを使用する必要があります。これは、コードのコストがほとんどかからず、将来も保証されるためです。

3
msw

短いバージョンでは、スーパークラスを必要としないクラシッククラスには、多くの古いコードを壊さずに回避できない制限がありました。そこで彼らは、objectからサブクラス化する新しいスタイルのクラスの概念を作成しました。これで、プロパティの定義などのクールなことができるようになり、dictのサブクラス化はもはや苦痛や奇妙なバグの練習ではなくなりました。

詳細は、Python docs: 新しいスタイルとクラシッククラス)のセクション3.3にあります。

0
Mike DeSimone

Python 2.2では「新しいスタイルクラス」が導入されました オブジェクトをサブクラス化していない古いスタイルクラスに関連する多くの追加機能がありました。サブクラスオブジェクトは、クラスが古いスタイルのクラスではなく、新しいスタイルのクラスであることを示すために選択された方法でした。

0
jemfinch