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



我对Python的面向对象方面还不太熟悉,所以这有点超出我的理解范围。

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

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

我读到isinstance()方法接受派生类类型,但我不能真正说服自己,我知道这里发生了什么。

也返回true。是因为这三个人属于同一类吗?

>>> isinstance([], (tuple, list, set))
True
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语句。很清楚,对吧?

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

,

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

尽管列表[]在Python中被认为是迭代器,就像元组,字典和集合一样,它不是从相同的基类派生的(除非您将object视为基类型,这几乎适用于所有类型)。

试试这个:

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

就像其他人回答的那样,给isinstance()一个元组就像在说:

>>> type([]) in (tuple, list, set)
True

tuplelist这样的类不是从同一个基类派生的子类,它们都只是通过提供__inter__()__next__()方法来遵循Iterable的协议。这是鸭子打字的美

最新更新