0

print type (variable)変数がどのクラスであるかを確認しようとすると、repl から次のように通知されます。

<type 'instance'>

どのように構築されたか/誰が変数を構築したかを確認する方法はありますか?

4

1 に答える 1

7

つまり、古いスタイルのクラスを使用しています。新しいコードでは、すべてのクラスは から継承する必要がありますobject:

In [3]: class A(object):
   ...:         pass

In [5]: type(A())
Out[5]: __main__.A

 

以下を見ると、古いスタイルのクラスのクラスを取得できます__class__

In [1]: class A: pass

In [2]: A().__class__
Out[2]: __main__.A

 

http://docs.python.org/2/reference/datamodel.html#new-style-and-classic-classes :

クラスとインスタンスには、古いスタイル (またはクラシック) と新しいスタイルの 2 つの種類があります。

Python 2.1 までは、ユーザーが利用できるフレーバーは古いスタイルのクラスだけでした。(古いスタイルの) クラスの概念は、型の概念とは無関係です。xが古いスタイルのクラスのインスタンスである場合、 はx.__class__のクラスを指定しますxが、type(x)常に<type 'instance'>です。これは、すべての古いスタイルのインスタンスが、そのクラスに関係なく、 instance と呼ばれる単一の組み込み型で実装されているという事実を反映しています。

クラスと型を統一するために、Python 2.2 で新しいスタイルのクラスが導入されました。新しいスタイルのクラスは、ユーザー定義型以上でも以下でもありません。xが新しいスタイルのクラスのインスタンスである場合、通常type(x)は と同じx.__class__です (ただし、これは保証されていません。新しいスタイルのクラス インスタンスは、 に対して返される値をオーバーライドすることが許可されていますx.__class__)。

...

互換性の理由から、クラスはデフォルトで古いスタイルのままです。新しいスタイルのクラスは、別の新しいスタイルのクラス (つまり型) を親クラスとして指定するか、他の親が必要ない場合は「最上位の型」オブジェクトを指定することによって作成されます。新しいスタイルのクラスの動作は、戻り値に加えて多くの重要な詳細において古いスタイルのクラスの動作とは異なりtype()ます。これらの変更の一部は、特別なメソッドの呼び出し方法など、新しいオブジェクト モデルの基本的なものです。その他は、多重継承の場合のメソッド解決順序のように、互換性の問題で以前は実装できなかった「修正」です。

古いスタイルのクラスは Python 3 で削除され、新しいスタイルのクラスのセマンティクスのみが残ります。

于 2013-03-29T21:50:42.880 に答える