web-dev-qa-db-ja.com

すべてのPythonクラスはオブジェクトを拡張する必要がありますか?

私は次の両方の仕事を見つけました:

class Foo():
    def a(self):
        print "hello"

class Foo(object):
    def a(self):
        print "hello"

すべてのPythonクラスはオブジェクトを拡張する必要がありますか?オブジェクトを拡張しないことで潜在的な問題はありますか?

118
Kara

Python 2では、objectを継承しないと、古いスタイルのクラスが作成されます。これにより、さまざまな効果の中で、typeが異なる結果をもたらします。

>>> class Foo: pass
... 
>>> type(Foo())
<type 'instance'>

vs.

>>> class Bar(object): pass
... 
>>> type(Bar())
<class '__main__.Bar'>

また、多重継承のルールは different であり、ここでは要約しません。 MIについて私が見たすべての優れたドキュメントは、新しいスタイルのクラスについて説明しています。

最後に、古いスタイルのクラスはPython 3で消滅し、objectからの継承は暗黙的になりました。したがって、古いソフトウェアとの下位互換性が必要でない限り、常に新しいスタイルのクラスを好みます。

106
Fred Foo

Python 3では、自分で言うかどうかにかかわらず、クラスはobjectを暗黙的に拡張します。

Python 2には、 古いスタイルと新しいスタイル クラスがあります。クラスが新しいスタイルであることを通知するには、objectから明示的に継承する必要があります。そうでない場合は、古いスタイルの実装が使用されます。

通常、新しいスタイルのクラスが必要です。 objectから明示的に継承します。これは、Python 2との互換性を目指すPython 3コードにも適用されることに注意してください。

58
slezica

python 3では、3つの異なる方法でクラスを作成でき、内部的にはすべて同じです(例を参照)。クラスの作成方法は関係ありません。python 3のすべてのクラスはobjectと呼ばれる特別なクラスを継承します。クラスobjectはpythonの基本クラスであり、二重アンダースコアメソッド、記述子、super()メソッド、property()メソッドなどの多くの機能を提供します。

例1.

class MyClass:
 pass

例2。

class MyClass():
 pass

例3.

class MyClass(object):
  pass
16
N Randhawa

はい、すべてのPythonクラスは(またはサブクラス、これはPythonここに)オブジェクトを拡張する必要があります。通常、深刻な問題は発生しませんが、場合によっては(複数の継承ツリーの場合のように)これは重要です。これにより、Python 3との互換性も向上します。

2
pydsigner

python3では違いはありませんが、python2ではobjectを拡張しないため、古いスタイルのクラスが得られます。古いスタイルのクラスよりも新しいスタイルのクラスを使用したい場合。

0
thkang