【摘要】
本文主要介绍python2.7中在判断数据类型时常用的type和isinstance的一些区别。以及在各种场景中的使用。
【正文】
一 type介绍
1.1 官方文档说明
翻译:type有两种使用方式。第一种是传入一个参数时,返回传入对象的类型对应的type类对象。这样可以获取到传入对象的类,但是如果是判断一个对象的所属类型,更推荐用内置的isinstance方法。下边一段是说利用type动态生成类,三个参数依次是类名(str),父类(tuple), 成员(dict)。不再赘述。
1.2 常规使用
`a = 1`
`print type(a) # 输出<type ‘int’>`
`import types`
`print type(a) == types.IntType # 输出True`
`print type(a) == type(1) # 输出True
1.3 判断自定义类
class Test1():
pass
class Test2():
pass
class Tets3(int):
pass
class Test(4):
pass
test1 = Test1()
test2 = Test2()
test3 = Test3()
test4 = Test4()
print type(test1) # 输出 <class ‘main.Test1’>
print type(test2) # 输出 <class ‘main.Test2’>
print type(test3) # 输出 <class ‘main.Test3’>
print type(test4) # 输出 <class ‘main.Test4’>
print type(test1) == type(test2) # 输出True
print type(test3) == type(12) # 输出False
print type(Test4)
print type(test4) == types.IntType # 输出False
print type(test4) == type(12) # 输出False
注意:
-
Test3是继承自Int,test3是Test3的实例,属于Test3类,也应该属于Int类。但是这里判断不是int类。type在判断类型时不会考虑继承关系。
-
test1和test2一个属于Test1类,一个属于Test2类,实际上是不同类型,type判断结果是同一类型。自定义类属于经典类时,type均会得到<type ‘isinstance’>
二 isinstance介绍
2.1 官方文档说明
翻译:isinstance(object, classinfo)。当object是classinfo或者其子类的一个实例/对象时返回True;当如果Object不是一个类的实例或者不是给出类型的对象就会返回False;当classinfo是一个元组时,只要元组中任意一个元素是object所属的类型或父类,都会返回True;如果传入的classinfo不是一个间接/直接类名、基本类型,或者由它们组成的元组,就会报一个TypeError异常。
2.2 常规使用
基本用法和type相似。基本类型取值可以是int float bool complex str list dict set tuple
print isinstance(1, int) # 返回True 这里是根据内置类型判断
对上面的实例使用isinstance操作:
print isinstance(test3, int) # 输出True 可以根据继承判断
print isinstance(test1, Test1) # 输出True
print isinstance(test1, Test2) # 输出False
三 总结
-
python2.7中,对于经典类的实例,type得到的结果都是<type ‘instance‘>。对于新式类,会得到
<class ‘main.Test1’>
-
python3中全部是新式类,就不存在这个情况。全部得到结果 <class ‘main.Test1’>
-
type判断类型时,只能判断当前类,不考虑继承关系。
-
isinstance判断类型时,会考虑继承关系。
-
官方推荐判断类型时,使用isinstance