2017-07-12 8 views
0

私はPythonで教科書を読んでいて、新しいスタイルのクラスの違いをカバーしています。古典的なクラスを使用するインタプリタではPython 2.xで次のコードを守ってください。Python 2.Xでisinstance(nonnewstyle、object)がtrueを返すのはなぜですか?

class C: pass 
X = C() 
isinstance(X, object) #returns true 
isinstance(C, object) #returns true 

(、1は2.X内のオブジェクトクラスから派生明示しなければならない新しいスタイルのクラスを使用するには)

だから、オブジェクトクラスから派生していないオブジェクト(古典クラスの場合のように)は、オブジェクトのインスタンスになることができますか? 3.Xと2.Xの場合、何が起こっているのですか?

これは重複した質問かどうかは、すべてが技術的にオブジェクトであることを既に知っていましたが、私は、isinstanceの結果をあきらかにするのではなく、Python自体の設計において、

+1

**すべて**はオブジェクトです。 'isinstance(オブジェクト、オブジェクト)'も真です。 –

+0

より有用なチェックは 'isinstance(C、type)'または 'issubclass(C、object)'でしょう。 – jonrsharpe

+0

[インスタンスは "オブジェクト"ですが、クラスは "オブジェクト"のサブクラスではありません:どうすれば可能ですか?](https://stackoverflow.com/questions/9699591/instance-is-an-object- object-how-is-this-po) – MSeifert

答えて

0

すべてobject自体を含むobjectのインスタンスで、次のとおりです。関係なく、他の引数は(その特別な方法を覚えている、selfためobjectに渡されないときtype.__instancecheck__ hook戻っTrueためだ

>>> isinstance(object, object) 
True 

は、type(something)で検索され、somethingではなく、selfが手動で渡されます。

あなたは古いスタイルのクラスをテストしたい場合は、クラスがtypeのインスタンス、またはobjectサブクラスであれば、はるかに有用な試験は、次のとおりです。

>>> isinstance(C, type) 
False 
>>> issubclass(C, object) 
False 

これらのテストのいずれかであります新しいスタイルのクラスのための真:インスタンスの場合

>>> class Newstyle(object): pass 
... 
>>> isinstance(Newstyle, type) 
True 
>>> issubclass(Newstyle, object) 
True 

、彼らはtypes.InstanceTypeのインスタンスです天気をテスト:

>>> isinstance(X, InstanceType) 
True 
+0

私はこのことを半分理解していると思います。すべてがオブジェクトなのですが、どういうものがオブジェクトのインスタンスになる可能性がありますか?まだオブジェクトをサブクラス化していませんか? – user3751940

+0

@ user3751940:オブジェクトのインスタンスチェックを忘れる。 '__instancecheck__'フックのため、テストは* virtual *です。 –

+0

私はそれを今得ます!ありがとう:) – user3751940

0

おそらくisinstanceissubclassを混同している可能性があります。古いスタイルのクラスobjectからを派生しません。つまり、issubclass(C, object)の結果はFalseになります。一方、新しいスタイルクラスでは、基本クラスとして常に(直接的または間接的に)objectが含まれます。

すべてはobjectのインスタンスです。したがって、isinstance(C, object)またはisinstance(x, object)を実行すると、常にTrueになります。 Pythonで

0

Xは古いスタイルのクラスCの古いスタイルのインスタンスで、objectのサブクラスではありません。

しかし、すべてのオブジェクトは、古いスタイルのインスタンスであっても、いくつかの型(新しいスタイルのクラス)のインスタンスです。すべての古いスタイルのインスタンスのタイプはtypes.InstanceTypeです。一緒にtypes.ClassType、古いスタイルのクラスのタイプ、これらの2つのタイプは、古いスタイルのクラスシステムの実装を担当しています。

types.InstanceTypeはすべて新しいスタイルのクラスと同様にobjectのサブクラスです。isinstance(X, object)は、Xの古いスタイルのクラスがobjectから継承されるためではなく、その新しいスタイルのクラスが継承するためtrueを返します。

+0

これはまた、洞察のおかげで感謝します。 – user3751940

関連する問題