为什么isinstance()方法返回True(Python 3.xx)

时间:2015-08-14 03:39:45

标签: python python-3.x

我对Python的OOP方面不太熟悉,所以这有点超出我的想象。

>>> a=[[2,3,4]]
>>> types = (list,str,int,str,int)
>>> b=isinstance(a,types)

True

无论我在列表类型后添加什么类型,表达式总是返回True

我已经读过isinstance()方法接受派生类类型,但我无法说服自己,我知道这里发生了什么。

这也返回true。是因为所有3个属于同一个班级吗?

>>> isinstance([], (tuple, list, set))
True

3 个答案:

答案 0 :(得分:4)

In [1]: isinstance?
     

文档字符串:

isinstance(object, class-or-type-or-tuple) -> bool
     

返回对象是类的实例还是其子类的实例。   使用类型作为第二个参数,返回是否为对象的类型。   使用元组isinstance(x, (A, B, ...))的表单是以下的快捷方式:

isinstance(x, A) or isinstance(x, B) or ... (etc.).
     

输入:builtin_function_or_method

所以,它实际上是一个or语句。很清楚,对吧?

答案 1 :(得分:1)

那是因为当你给一个类型元组作为isinstance的第二个参数它作为'OR'(或任何)时,如果第一个参数的类型是该元组中的任何类型,它将返回True。

示例 -

>>> isinstance('asd',(str,bool,int))
True

答案 2 :(得分:1)

虽然列表class WebElementDecorator在Python中被视为 Iterator ,但就像元组,字典和集合一样,它不是从同一个基类派生的(除非你考虑{{1} }作为基本类型,几乎适用于所有类型。)

试试这个:

[]

像其他人一样回答,给object一个元组就像这样说:

>>> [].__class__
<type 'list'>
>>> ().__class__
<type 'tuple'>
>>> {}.__class__
<type 'dictionary'>
>>> [].__class__.__bases__
<type 'object'>  # yeah sure

isinstance()>>> type([]) in (tuple, list, set) True 之类的类不是从同一个基类派生的子类,它们只是通过提供tuple和{{1}来符合list的协议}} 方法。这是鸭子打字的美妙。