资讯专栏INFORMATION COLUMN

python判断变量类型时,判断一个变量的类型时为什么不使用type(),而是用isinstance

jk_v1 / 1069人阅读

摘要:即使需要检查类型,也应该用来判断,这样你期望类型的也能正常被处理比如,一个函数需要处理类型,那么它应该也能处理的子类型,所以应该使用这样来判断而不是来判断。结论尽量不要使用方法,多使用,这样可以减少错误。

注意:本文代码测试均在python2.75环境

python判断变量数据类型目前有两种方法:

第一种方法使用type()方法:

In [22]: type(111)==int
Out[22]: False

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/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(),这样可以减少错误。

参考:

http://www.chenxm.cc/post/429...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/40943.html

相关文章

  • Python入门细节

    摘要:入门细节相除后的类型双斜杠是整除,出来的类型是。序列,集合和字典属于组,是的基本数据类型。变量名区分大小写。尽量避免循环引入。变量函数等引入内指定的变量函数等。中如果没有出现模块名也是绝对导入。顶级包与入口文件的位置 python入门细节 相除后的类型 type(2/2) float type(2//2) int 双斜杠是整除,出来的类型是int。单斜杠的出来的是float类型。 进制...

    microcosm1994 评论0 收藏0
  • python3入门与进阶(一)

    摘要:语言也被称作为胶水语言,可以混合其他如,等来编程可以把其他语言制作的各种模块尤其是很轻松的联结在一起。会认为子类是一种父类类型。 最近学习了python3的语法,整理记录一下;语法是编程的先决条件,精通语法是编好程序的必要条件; 导语 给我最大的感觉是:这个语言的编写,居然不使用 { }来控制代码块的区域,而是使用缩进来分割代码块,所以使用python语言编写的代码不能压缩混淆。能够...

    Panda 评论0 收藏0
  • 装饰器给python函数加上类型限制

    摘要:列表越界的列表类似于动态数组,没有长度的限制。比如对将要传进内层函数的参数进行检测等,从而实现对参数的类型进行限制。对二维列表的每一维列表进行长度限制,不足指定长度,自动补充指定元素。 前言 作为一名python的脑残粉,请先跟我念一遍python大法好。 其作为动态语言的灵活,简介的代码,确实在某些情况下确实比其他编程语言要好。但你有没有想过,有时这些灵活的语法,可能会造成一些糟糕的...

    BigTomato 评论0 收藏0
  • Python入门学习(二)

    摘要:在迈过的大门后正式开始了解变量变量定义当看到的变量定义方式时让我有一点意外即没有变量的类型说明符也没有定义变量的标志符如的的这样就定义一个变量这个变量的类型取决于变量指向的值行尾不能加分号让我也是纠结了好一会儿不过还是要入乡随俗的慢慢习惯了 在迈过HelloWorld的大门后, 正式开始了解Python 变量 变量定义 当看到Python的变量定义方式时, 让我有一点意外.即没有变量的...

    testbird 评论0 收藏0
  • python学习笔记3---变量与运算符

    摘要:什么是变量假设两个做数学运算先把乘以,然后加上,最后再加上列表变量名的命名规则变量名命名只能使用字母数字下划线变量名的首字母不能是数字系统关键字,不能用在变量名中保留关键字不是系统保留关键字,但是不建议作为变量名,否则极易出错动态语言的特性 什么是变量 假设两个list做数学运算 >>> [1,2,3,4,5,6] [1,2,3] Traceback (most recent call...

    LMou 评论0 收藏0

发表评论

0条评论

jk_v1

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<