Python:可以isinstance(i,type(i))计算为False?

Jan*_*cke 2 python oop built-in

我正在寻找something下面的代码片段,以便在任何情况下isinstance()检查后评估True:

i = WonderfulClass()
classinfo_of_i = something(i)
isinstance(i, classinfo_of_i) # must evaluate to True
Run Code Online (Sandbox Code Playgroud)

如果type你的回答如此,如果你解释了原因,我将不胜感激.是type真正的对应物isinstance吗?或者,反过来问,你能想到一个isinstance(i, type(i))评估为False 的案例吗?

这个问题出现在检查列表或集合的元素是否是单一类型的简单方法的上下文中,我们必须通过序列并检查所有序列元素是否属于同一类型.在这种情况下,元素将相互比较.该比较可以基于type或基于isinstance.

相关文档有关isinstance(object, classinfo):

如果object参数是classinfo参数的实例,则返回true

Sha*_*hin 6

"类型是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;
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

请注意,这Py_TYPE只是一个返回obj->ob_type与返回值匹配的宏type().这在Include/object.h中定义为:

#define Py_TYPE(ob) (((PyObject*)(ob))->ob_type)
Run Code Online (Sandbox Code Playgroud)