注意:本文代码测试均在python2.75环境
python判断变量数据类型目前有两种方法:
第一种方法使用type()方法:
In [22]: type(111)==intOut[22]: FalseIn [25]: import typesIn [26]: type(111)==types.IntTypeOut[26]: True
第二种方法使用isinstance()方法:
In [27]: isinstance(111,int)Out[27]: True
不使用type()代码示例:
代码示例:
class A(object): pass class B(A): pass print type(A()) == A # Trueprint type(B()) == A # Falseprint isinstance(A(),A) # Trueprint isinstance(B(),A) # True
特殊代码示例:
from collections import Iteratorclass A(object): def __iter__(self): pass def next(self): passisinstance(A(), Iterator) # Truetype(A()) == Iterator # False
一个明显的区别是在判断子类。这个主要是由于python新式类和旧式类区别造成,相关链接:http://www.python.org/doc/new...
type()不会认为子类是一种父类类型。
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(),这样可以减少错误。
共同学习,写下你的评论
评论加载中...
作者其他优质文章