我对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
像tuple
和list
这样的类不是从同一个基类派生的子类,它们都只是通过提供__inter__()
和__next__()
方法来遵循Iterable
的协议。这是鸭子打字的美