137

次の両方が機能することがわかりました。

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

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

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

4

6 に答える 6

125

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

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

対。

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

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

最後に、古いスタイルのクラスは Python 3 で姿を消し、 からの継承objectは暗黙的になりました。したがって、古いソフトウェアとの後方互換性が必要でない限り、常に新しいスタイルのクラスを優先してください。

于 2013-03-13T00:31:29.893 に答える
74

objectPython 3 では、クラスは、自分で言うかどうかに関係なく、暗黙的に拡張されます。

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

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

于 2013-03-13T00:29:55.510 に答える
17

Python 3 では、3 つの異なる方法でクラスを作成でき、内部的にはすべて同じです (例を参照)。クラスの作成方法は関係ありません。python 3 のすべてのクラスは objectという特別なクラスから継承されます。クラスオブジェクト は Python の基本クラスであり、二重下線メソッド、記述子、super() メソッド、property() メソッドなどの多くの機能を提供します。

例 1。

class MyClass:
 pass

例 2。

class MyClass():
 pass

例 3。

class MyClass(object):
  pass
于 2016-06-16T11:57:23.237 に答える
1

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

于 2013-03-13T00:29:15.430 に答える
0

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

于 2013-03-13T00:30:09.670 に答える