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

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

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

注意:本文代码测试均在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判断变量类型时,判断一个变量的类型时为什么不使用type(),而是用isinstance()方法全部内容,希望文章能够帮你解决python判断变量类型时,判断一个变量的类型时为什么不使用type(),而是用isinstance()方法所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1198406.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存