python判断变量类型时,判断一个变量的类型时为什么不使用type()
注意:本文代码测试均在python2.75环境 python判断变量数据类型目前有两种方法: 第一种方法使用type()方法: In [22]: type(111)==int Out[22]: True In [25]: import types In [26]: type(111)==types.IntType Out[26]: True 第二种方法使用isinstance()方法: In [27]: isinstance(111,int) Out[27]: True 为什么不使用type()代码示例: 代码示例: 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/newstyle/ type()不会认为子类是一种父类类型。 isinstance()会认为子类是一种父类类型 正常情况下不应该编写代码检查类型的,而应该直接假设被操作的instance具有你希望的属性,否则抛出异常。即使需要检查类型,也应该用isinstance来判断,这样你期望类型的subclass也能正常被处理(比如,一个函数需要处理Message类型,那么它应该也能处理Message的子类型MyMessage,所以应该使用isinstance(arg,Message)这样来判断而不是type(arg) == Message来判断)。 参考Duck Typing http://en.wikipedia.org/wiki/Duck_typing 代码示例额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就显得不可靠了。 python2特殊例子: class A: pass type(A())==A # False class A(object): pass type(A())==A #True 该特殊现象只存在python2.x中,因为python3,类默认全部是新式类,而python2默认是经典类。 结论: 尽量不要使用type()方法,多使用isinstance(),这样可以减少错误。 参考: http://www.jianshu.com/p/7ef549503c93 https://segmentfault.com/q/1010000000127305 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 查找系统盘中需要找的字符
- Python处理json字符串转化为字典的简单实现
- IronPython的任何替代品,Python for .NET用于从python访问C
- Python实现对百度云的文件上传(实例讲解)
- Python 实现淘宝秒杀的示例代码
- 爬虫验证码很难吗?自动识别验证码程序了解一下?
- Python BaseHTTPServer.HTTPServer – 启动和停止事件的回调
- python安装PIL模块时Unable to find vcvarsall.bat错误的解
- python – 为什么time.clock比time.time给出更长的时间?
- python-基于2个条件用某个数值填充多个NaN值