なぜ私がそうしたら:
class C(): pass
type(C())
私が得た: <type 'instance'>
、しかし私がそうする場合:
class C(object): pass
type(c())
私は得ました:<class '__main__.c'>
?
最初のものはあまりユーザーフルではありません
なぜ私がそうしたら:
class C(): pass
type(C())
私が得た: <type 'instance'>
、しかし私がそうする場合:
class C(object): pass
type(c())
私は得ました:<class '__main__.c'>
?
最初のものはあまりユーザーフルではありません
古いスタイルのクラスと新しいスタイルのクラスの違いを調べてください。前者はデフォルトであり、後者はオブジェクトから明示的に継承します。
すべての古いスタイルのオブジェクトは、組み込み型のインスタンスで実装されました。それらがまだデフォルトであり、それらのタイプが「インスタンス」のままであるという事実は、レトロ互換性の予防措置の結果です。
これはPythonドキュメント(http://docs.python.org/reference/datamodel.html)から抽出されます
3.3。新しいスタイルとクラシッククラスクラスとインスタンスには、古いスタイル(またはクラシック)と新しいスタイルの2つのフレーバーがあります。
Python 2.1までは、古いスタイルのクラスがユーザーが利用できる唯一のフレーバーでした。(古いスタイルの)クラスの概念は、型の概念とは無関係です。xが古いスタイルのクラスのインスタンスである場合、xです。classはxのクラスを指定しますが、type(x)は常にです。これは、クラスに関係なく、すべての古いスタイルのインスタンスが、インスタンスと呼ばれる単一の組み込み型で実装されているという事実を反映しています。
新しいスタイルのクラスは、クラスと型を統合するためにPython2.2で導入されました。新しいスタイルのクラスは、ユーザー定義型以上でもそれ以下でもありません。xが新しいスタイルのクラスのインスタンスである場合、type(x)は通常x>と同じです。クラス(これは保証されていませんが、新しいスタイルのクラスインスタンスは、x。classに対して返される値をオーバーライドできます)。
新しいスタイルのクラスを導入する主な動機は、完全なメタモデルを備えた統合オブジェクトモデルを提供することです。また、ほとんどの組み込み型をサブクラス化する機能や、計算されたプロパティを有効にする「記述子」の導入など、多くの実用的な利点があります。
互換性の理由から、クラスはデフォルトでまだ古いスタイルです。新しいスタイルのクラスは、別の新しいスタイルのクラス(つまり、タイプ)を親クラスとして指定するか、他の親が必要ない場合は「トップレベルタイプ」オブジェクトを指定することによって作成されます。新しいスタイルのクラスの動作は、type()が返すものに加えて、いくつかの重要な詳細が古いスタイルのクラスの動作とは異なります。これらの変更のいくつかは、特別なメソッドが呼び出される方法のように、新しいオブジェクトモデルの基本です。その他は、多重継承の場合のメソッド解決順序など、互換性の問題のために以前は実装できなかった「修正」です。
このマニュアルは、Pythonのクラスの仕組みを包括的にカバーすることを目的としていますが、新しいスタイルのクラスのカバーに関しては、まだ一部の領域で不足している可能性があります。 追加情報のソースについては、 http://www.python.org/doc/newstyle/を参照 してください。
古いスタイルのクラスはPython3.0で削除され、新しいスタイルのクラスのセマンティクスのみが残ります。