注意:本文代码测试均在python2.75环境html
python判断变量数据类型目前有两种方法:python
第一种方法使用type()方法:segmentfault
In [22]: type(111)==int Out[22]: False In [25]: import types In [26]: type(111)==types.IntType Out[26]: True
第二种方法使用isinstance()方法:python2.7
In [27]: isinstance(111,int) Out[27]: True
不使用type()代码示例:函数
代码示例:post
class A(object): pass class B(A): pass print type(A()) == A # True print type(B()) == A # False print isinstance(A(),A) # True print isinstance(B(),A) # True
特殊代码示例:测试
from collections import Iterator class A(object): def __iter__(self): pass def next(self): pass isinstance(A(), Iterator) # True type(A()) == Iterator # False
一个明显的区别是在判断子类。这个主要是因为python新式类和旧式类区别形成,相关连接:http://www.python.org/doc/new...code
type()不会认为子类是一种父类类型。htm
isinstance()会认为子类是一种父类类型继承
正常状况下不该该编写代码检查类型的,而应该直接假设被操做的instance具备你但愿的属性,不然抛出异常。即便须要检查类型,也应该用isinstance来判断,这样你指望类型的subclass也能正常被处理(好比,一个函数须要处理Message类型,那么它应该也能处理Message的子类型MyMessage,因此应该使用isinstance(arg,Message)这样来判断而不是type(arg) == Message来判断)。
参考Duck Typing http://en.wikipedia.org/wiki/...
代码示例额2:
import typesclass UserInt(int): def __init__(self, val=0): self.val = int(val) i = 1n = UserInt(2) print(type(i) is type(n)) # False
这就说明i和n的类型是不同的,而实际上UserInt是继承自int的,因此这个判断是存在问题的,当咱们对Python内建类型进行扩展的时候,type返回的结果就不够准确了。这就说明i和n的类型是不同的,而实际上UserInt是继承自int的,因此这个判断是存在问题的,当咱们对Python内建类型进行扩展的时候,type返回的结果就不够准确了。
代码示例3:
class A(): pass class B(): pass a = A() b = B() print(type(a) is type(b)) # True
type比较的结果a和b的类型是同样的,结果明显是不许确的。这种古典类的实例,type返回的结果都是同样的,而这样的结果不是咱们想要的。对于内建的基本类型来讲,使用tpye来检查是没有问题的,但是当应用到其余场合的时候,type就显得不可靠了。
结论:
尽可能不要使用type()方法,多使用isinstance(),这样能够减小错误。
参考: