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