使用isinstance()
对于class的继承关系来说,使用 type() 就很不方便。我们要判断class的类型,可以使用 isinstance() 函数。
我们回顾上次的例子,如果继承关系是:
object -> Animal -> Dog -> Husky
那么, isinstance() 就可以告诉我们,一个对象是否是某种类型。先创建3种类型的对象:
>>> a = Animal()
>>> d = Dog()
>>> h = Husky()
然后,判断:
>>> isinstance(h, Husky)
True
没有问题,因为 h 变量指向的就是Husky对象。
再判断:
>>> isinstance(h, Dog)
True
h 虽然自身是Husky类型,但由于Husky是从Dog继承下来的,所以, h 也还是Dog类型。换句话说, isinstance() 判断的是一个对象是否是该类型本身,或者位于该类型的父继承链上。
因此,我们可以确信, h 还是Animal类型:
>>> isinstance(h, Animal)
True
同理,实际类型是Dog的 d 也是Animal类型:
>>> isinstance(d, Dog) and isinstance(d, Animal)
True
但是, d 不是Husky类型:
>>> isinstance(d, Husky)
False
能用 type() 判断的基本类型也可以用 isinstance() 判断:
>>> isinstance('a', str)
True
>>> isinstance(123, int)
True
>>> isinstance(b'a', bytes)
True
并且还可以判断一个变量是否是某些类型中的一种,比如下面的代码就可以判断是否是list或者tuple:
>>> isinstance([1, 2, 3], (list, tuple))
True
>>> isinstance((1, 2, 3), (list, tuple))
True