2

something次のコードを探しているので、isinstance()後でチェックTrueがいずれの場合にも評価されます。

i = WonderfulClass()
classinfo_of_i = something(i)
isinstance(i, classinfo_of_i) # must evaluate to True

という回答でしたらtype、その理由を教えていただければ幸いです。typeの真の対応物isinstanceは? isinstance(i, type(i))または、逆に、 がFalse と評価されるケースを思いつきますか?

この質問は、リストまたはセットの要素が単一の型であるかどうかを確認する簡単な方法のコンテキストで発生しましたか? ここでは、シーケンスを調べて、すべてのシーケンス要素が同じ種類であるかどうかを確認する必要があります。このコンテキストでは、要素が互いに比較されます。この比較は、に基づいているtypeか、に基づいている可能性がありますisinstance

に関する関連文書isinstance(object, classinfo):

object 引数が classinfo 引数のインスタンスである場合は true を返します

4

4 に答える 4

6

「type は isinstance の真の対応物ですか? あるいは逆に、isinstance(i, type(i)) が False と評価されるケースを考えられますか?」

isinstance(i, type(i))戻らない状況は見当たりませんTrue

type()isinstance()インスタンスから型オブジェクトを検査して返すため、返された値がチェックに失敗する理由はありません。

cPython のソースを掘り下げると、コード ビハインドtype()は単にインスタンスにアタッチされた型オブジェクトを返すことがわかります。

v = (PyObject *)o->ob_type;
Py_INCREF(v);
return v;

isintance() コードが最初に行うことは、型が正確に一致するかどうかを確認することです (後で、継承のチェーン内のクラスとの一致に進みます)。

int
PyObject_IsInstance(PyObject *inst, PyObject *cls)
{
   _Py_IDENTIFIER(__instancecheck__);
   PyObject *checker;

   /* Quick test for an exact match */
   if (Py_TYPE(inst) == (PyTypeObject *)cls)
      return 1;

は、 の戻り値と一致するものPy_TYPEを返す単なるマクロであることに注意してください。これは、Include/object.h で次のように定義されていますobj->ob_typetype()

#define Py_TYPE(ob) (((PyObject*)(ob))->ob_type)
于 2012-09-13T09:30:23.277 に答える
2

まず第一に、isinstance継承に対処するためのものです。例えば

>>> isinstance("asdfs", object)
True

ここでは、「str」型は「object」型の継承者であるため、文字列はオブジェクトのインスタンスと見なされました。したがって、typeはisinstanceの厳密な対応物ではありません。

すべてがPythonのオブジェクトであるため、isinstance(anything、object)はすべてに対してTrueを返す必要があります。したがって、配列内のすべての値は、クラス階層に共通の祖先であるobjectを持ちます。

より特殊なタイプを直接参照/変数に格納して比較できるようにしたい場合は、typesモジュールが興味深いかもしれません。

于 2012-09-13T09:44:58.703 に答える
2

type()期待どおりの結果を返しますが、新しいスタイル クラスを使用した場合のみです (継承元object)。

次の点を考慮してください。

>>> class WonderfulClass(object):
...     pass
...
>>> i = WonderfulClass()
>>> isinstance(i,type(i))
True
>>> type(i)
<class '__main__.WonderfulClass'>
>>> class AnotherClass:
...     pass
...
>>> z = AnotherClass()
>>> type(z)
<type 'instance'>
>>> isinstance(z,type(z))
True

したがって、isinstanceチェックは機能しますが、違いに注意する価値があります。

于 2012-09-13T09:39:16.520 に答える
1
>>> class P:
...   pass
...
>>> p = P()
>>> type(p)
<type 'instance'>
>>> p.__class__
<class __main__.P at 0x015A6A78>

>>> class D(object):
...   pass
...
>>>
>>> d = D()
>>> type(d)
<class '__main__.D'>
>>> d.__class__
<class '__main__.D'>
于 2012-09-13T09:43:00.467 に答える