私は次の両方の仕事を見つけました:
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では、継承しないobject
と古いスタイルのクラスが作成され、他の効果の中で、type
さまざまな結果が得られます。
>>> class Foo: pass
...
>>> type(Foo())
<type 'instance'>
対
>>> class Bar(object): pass
...
>>> type(Bar())
<class '__main__.Bar'>
また、多重継承のルールは、ここで要約するつもりはありませんが異なります。MIについて私が見たすべての優れたドキュメントは、新しいスタイルのクラスを説明しています。
最後に、古いスタイルのクラスはPython 3でなくなり、継承object
は暗黙的になります。したがって、古いソフトウェアとの下位互換性が必要でない限り、常に新しいスタイルのクラスを優先してください。
Python 3では、object
自分で言ったかどうかにかかわらず、クラスは暗黙的に拡張されます。
Python 2には、古いスタイルと新しいスタイルのクラスがあります。クラスが新しいスタイルであることを示すには、から明示的に継承する必要がありますobject
。そうでない場合は、古いスタイルの実装が使用されます。
通常、新しいスタイルのクラスが必要です。object
明示的に継承します。これは、Python 2との互換性を目的としたPython 3コードにも適用されることに注意してください。
Python 3では、3つの異なる方法でクラスを作成でき、内部的にはすべて同じです(例を参照)。クラスの作成方法は関係ありません。Python3のすべてのクラスは、objectという特別なクラスを継承し ます。クラスオブジェクト はPythonの基本的なクラスであり、二重下線メソッド、記述子、super()メソッド、property()メソッドなどの多くの機能を提供します。
例1。
class MyClass:
pass
例2。
class MyClass():
pass
例3。
class MyClass(object):
pass
object
built-inを参照することが一般的に想定されていますobject
。CPythonの組み込み識別子を置き換えることができることを考慮する必要がある場合は、データモデルについてほとんどアサーションを作成できません。str
文字列を割り当てることができるため、必ずしも文字列を引数として受け入れないことを真剣に主張できbuiltins.str = None
ますか?
はい、すべてのPythonクラスはオブジェクト(またはここではPythonです)を拡張する必要があります。通常、重大な問題は発生しませんが、場合によっては(複数の継承ツリーの場合など)、これが重要になります。これにより、Python 3との互換性も向上します。
他の回答がカバーしているように、オブジェクトからのPython 3の継承は暗黙的です。しかし、彼らはあなたが何をすべきか、そして何が慣習であるかを述べていません。
Python 3のドキュメントの例ではすべて、次のスタイルを使用しています。これは慣例です。今後のPython 3のコードでは、これに従うことをお勧めします。
class Foo:
pass
出典:https : //docs.python.org/3/tutorial/classes.html#class-objects
引用例:
クラスオブジェクトは、属性参照とインスタンス化の2種類の操作をサポートしています。
属性参照は、Pythonでのすべての属性参照に使用される標準構文obj.nameを使用します。有効な属性名は、クラスオブジェクトが作成されたときにクラスの名前空間にあったすべての名前です。したがって、クラス定義が次のようになったとします。
class MyClass: """A simple example class""" i = 12345 def f(self): return 'hello world'
別の引用:
一般的に言って、インスタンス変数は各インスタンスに固有のデータ用であり、クラス変数はクラスのすべてのインスタンスで共有される属性とメソッド用です。
class Dog: kind = 'canine' # class variable shared by all instances def __init__(self, name): self.name = name # instance variable unique to each instance
python3では違いはありませんが、python2では拡張しないobject
ことで古いスタイルのクラスが得られます。古いスタイルのクラスよりも新しいスタイルのクラスを使用したい。
class Foo():
とはclass Foo:
?私は、Pythonの3の作業の両方を観察したよう