使用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