次の両方が機能することがわかりました。
class Foo():
def a(self):
print "hello"
class Foo(object):
def a(self):
print "hello"
すべての Python クラスはオブジェクトを拡張する必要がありますか? オブジェクトを拡張しないことによる潜在的な問題はありますか?
次の両方が機能することがわかりました。
class Foo():
def a(self):
print "hello"
class Foo(object):
def a(self):
print "hello"
すべての Python クラスはオブジェクトを拡張する必要がありますか? オブジェクトを拡張しないことによる潜在的な問題はありますか?
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
は暗黙的になりました。したがって、古いソフトウェアとの後方互換性が必要でない限り、常に新しいスタイルのクラスを優先してください。
object
Python 3 では、クラスは、自分で言うかどうかに関係なく、暗黙的に拡張されます。
Python 2 には、古いスタイルのクラスと新しいスタイルのクラスがあります。クラスが新しいスタイルであることを示すには、から明示的に継承する必要がありますobject
。そうでない場合は、古いスタイルの実装が使用されます。
通常、新しいスタイルのクラスが必要です。object
明示的に継承します。これは、Python 2 との互換性を目指す Python 3 コードにも適用されることに注意してください。
Python 3 では、3 つの異なる方法でクラスを作成でき、内部的にはすべて同じです (例を参照)。クラスの作成方法は関係ありません。python 3 のすべてのクラスは objectという特別なクラスから継承されます。クラスオブジェクト は Python の基本クラスであり、二重下線メソッド、記述子、super() メソッド、property() メソッドなどの多くの機能を提供します。
例 1。
class MyClass:
pass
例 2。
class MyClass():
pass
例 3。
class MyClass(object):
pass
はい、すべての Python クラスはオブジェクトを拡張 (またはむしろサブクラス、これは Python です) する必要があります。通常は重大な問題は発生しませんが、場合によっては (複数の継承ツリーのように) これが重要になります。これにより、Python 3 との互換性も向上します。
python3 では違いはありませんが、python2 では拡張しないobject
と古いスタイルのクラスになります。古いスタイルのクラスよりも新しいスタイルのクラスを使用したい場合。