当我们拿到一个对象的引用时,如何知道这个对象是什么类型、有哪些方法呢?
使用type()
首先,我们来判断对象类型,使用type()函数:
基本类型都可以用type()判断:
>>> type(123)<type 'int'>>>> type('str')<type 'str'>>>> type(None)<type 'NoneType'>
如果一个变量指向函数或者类,也可以用type()判断:
>>> type(abs)<type 'builtin_function_or_method'>>>> type(a)<class '__main__.Animal'>
但是type()函数返回的是什么类型呢?它返回type类型。如果我们要在if语句中判断,就需要比较两个变量的type类型是否相同:
>>> type(123)==type(456)True>>> type('abc')==type('123')True>>> type('abc')==type(123)False
但是这种写法太麻烦,Python把每种type类型都定义好了常量,放在types模块里,使用之前,需要先导入:
>>> import types>>> type('abc')==types.StringTypeTrue>>> type(u'abc')==types.UnicodeTypeTrue>>> type([])==types.ListTypeTrue>>> type(str)==types.TypeTypeTrue
最后注意到有一种类型就叫TypeType,所有类型本身的类型就是TypeType,比如:
>>> type(int)==type(str)==types.TypeTypeTrue
使用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类型:
能用type()判断的基本类型也可以用isinstance()判断:
>>> isinstance('a', str)True>>> isinstance(u'a', unicode)True>>> isinstance('a', unicode)False
新闻热点
疑难解答