聊一聊isinstance与type

聊一聊isinstance与type

最近写代码的时候遇到了一个关于isinstancetype的坑,这里给大家分享下,如果大家也遇到了同样的问题,希望本文能为大家解决疑惑把。

isinstance(obj,cls)

isinstance有两个参数,obj表示待比较的对象,cls表示“疑似是obj从属的类”,返回值是bool类型的True或者False
举一个简单的例子:我们想从一个多层嵌套的列表中获取每一个元素:
A = [1,2,[3,4,[5,6,[7,8,[9,10]]]]]
这种问题我们可以用递归来解决这类问题:遍历这个列表,遇到是数字类型的就直接打印,遇到列表类型的继续“递归”。实现代码如下:
def recursion(lis):
    for i in lis:
        if  isinstance(i,int):
           print(i,end=' ')
        elif isinstance(i,list):
            recursion(i)
if __name__ == '__main__':
    A = [1,2,[3,4,[5,6,[7,8,[9,10]]]]]
    recursion(A)
结果如下:
1 2 3 4 5 6 7 8 9 10 
关于本程序的BUG大家可以忽略,写成酱紫的是为了帮助大家分析问题:我们在recursion函数中使用了isinstance去判断我们遍历的元素是列表类型还是int类型的,针对每一种类型我们做出不同的处理。

isinstance“承认继承关系”

何谓isinstance“承认继承关系”呢?上面的例子可能说明不了问题,我们在看下面这段代码:
class GrandFather(object):pass
class Father(GrandFather):pass
class Son(Father):pass
son = Son()
print(isinstance(son,Son))
print(isinstance(son,Father))
print(isinstance(son,GrandFather))
从上面这段代码可以看出,类Father继承自GrandFather,类Son继承自Father,对象son是类Son实例化的一个对象。
结合小标题,大家猜一猜结果是什么呢?
对!没错!!小伙子你很聪明!!!结果就是:
True
True
True
也就是说,isinstance不止可以判断对象与实例化这个对象类的关系,还能接受“继承关系”。

type(obj[cls])

关于type就很有意思了:如果type里的参数是一个对象,那结果会显示实例化这个对象的类;那么如果里面的参数是一个类呢?
赶紧打开你的IDE试试!!!体会一下什么是Python中一切皆对象!
回到我们type里面是一个对象的话题:看下面这段代码:
print(type(123))
print(type('123'))
print(type([1,2,3]))
print(type((1,2,3)))
print(type({1,2,3}))
我们要查看这些数据对象的类型,当然我们一眼就可以看出来是什么类型的,so easy~结果如下:
<class 'int'>
<class 'str'>
<class 'list'>
<class 'tuple'>
<class 'set'>
结果正如我们所料,但是,如果是一个我们自定义的类实例化出的对象呢?
class Son:pass
son = Son()
print(type(son))
如上所示,我们利用一个类Son实例化出一个对象son,那么结合上面的例子,type(son)的值是什么呢?
没错!聪明的你叕叕叕猜对了:
<class '__main__.Son'>
结果就是当前文件的一个叫Son的东东,就是我们定义的Son类。

type“不承认继承关系”

说到这里,相信你会联想到上面isinstance的例子:要是继承会如何呢?
class GrandFather:pass
class Father(GrandFather):pass
class Son(Father):pass
son = Son()
print(type(son) is Son)
print(type(son) is Father )
print(type(son) is GrandFather )
这里你可能猜不到了,先给出结果再进行说明:
True
False
False
我们可以看到,只有Son与type(son)相等,也就是说,只有直接实例化这个对象的类才是type(对象)的类,即使有继承关系,type也不会“承认”这个类的父类的
对于这个结论,大家记住就好了,希望本文内容能为大家以后的编码生涯避免一些BUG的产生!
最后,不知道你试过type(cls)没有,赶紧打开自己的IDE试试下面这段代码:
class GrandFather:pass
class Father(GrandFather):pass
class Son(Father):pass
son = Son()

print(type(GrandFather))
print(type(Father))
print(type(Son))
你会发现,结果是一样的————而且会引出一个十分重要的知识点:元类/惊恐/惊恐/惊恐

原文地址:https://www.cnblogs.com/paulwhw/p/10637282.html

时间: 2024-08-07 19:05:44

聊一聊isinstance与type的相关文章

isinstance 和 type 的区别

class A: pass class B(A): pass isinstance(A(), A) # returns True type(A()) == A # returns True isinstance(B(), A) # returns True type(B()) == A # returns False  摘自 区别就是: type()不会认为子类是一种父类类型. isinstance()会认为子类是一种父类类型. 注意:在 Python2 中是没有布尔型的,它用数字 0 表示 F

面向对象中特殊方法的补充、isinstance/issubclass/type、方法和函数、反射

一.面向对象中特殊方法的补充 1.__str__ 能将对象名改成你想要的字符串,但是类型还是类 class Foo(object): def __init__(self): pass def func(self): pass def __str__(self): return "f1" obj = Foo() print(obj,type(obj)) # f1 <class '__main__.Foo'> 2.__doc__ 能将类的注释文档显示出来 class Foo(o

Python基础课:测试type 和 isinstance 那个的速度更快

废话不说,直接上源码 1 #装饰器 2 import time 3 def runtime(func): 4 def inner_func(*args, **kwargs): 5 startTime = time.time() 6 res = func(*args) 7 print('run time:{}'.format(time.time()- startTime)) 8 return res 9 return inner_func 10 11 #测试type函数 12 def test_t

type,isinstance判断一个变量的数据类型

type,isinstance判断一个变量的数据类型 import types type(x) is types.IntType # 判断是否int 类型 type(x) is types.StringType #是否string类型 ......... -------------------------------------------------------- 超级恶心的模式,不用记住types.StringType import types type(x) == types(1) # 判

python 内建函数isinstance的用法以及与type的区别

isinstance是Python中的一个内建函数 语法: isinstance(object, classinfo) 如果参数object是classinfo的实例,或者object是classinfo类的子类的一个实例, 返回True.如果object不是一个给定类型的的对象, 则返回结果总是False. 如果classinfo不表示一个类(类型对象), 那么它要么是一个类的元组, 或者递归地包含这样的(由数据类型构成的)元组.其他的序列类型是不被允许的. 如果classinfo不是一种数据

14 isinstance type issubclass及反射

一 isinstance() .type(). issubclass() issubclass(xxx,ooo)内置函数可以帮我们判断类xxx类是不是ooo类的子类. class AAA: pass class BBB(AAA): pass class CCC(BBB): pass print(issubclass(BBB,AAA)) #True print(issubclass(AAA,BBB))#False print(issubclass(CCC,AAA)) #True 可以隔代检测 is

python isinstance()函数和type()函数

一.type()用法 描述: python的 type 函数有两个用法,当只有一个参数的时候,返回对象的类型.当有三个参数的时候返回一个类对象. 语法: 一个参数:type(object) 三个参数:type(name,bases,dict) 用法: 一个参数时,type()返回一个对象的数据类型 1 >>> type(1) 2 <class 'int'> 3 >>> type('alex') 4 <class 'str'> 5 >>

Python isinstance() 函数 Python 内置函数 Python 内置函数

描述 isinstance() 函数来判断一个对象是否是一个已知的类型,类似 type(). isinstance() 与 type() 区别: type() 不会认为子类是一种父类类型,不考虑继承关系. isinstance() 会认为子类是一种父类类型,考虑继承关系. 如果要判断两个类型是否相同推荐使用 isinstance(). 语法 以下是 isinstance() 方法的语法: isinstance(object, classinfo) 参数 object -- 实例对象. class

isinstance() 函数

Python3 isinstance() 函数 描述 isinstance() 函数来判断一个对象是否是一个已知的类型,类似 type(). isinstance() 与 type() 区别: type() 不会认为子类是一种父类类型,不考虑继承关系. isinstance() 会认为子类是一种父类类型,考虑继承关系. 如果要判断两个类型是否相同推荐使用 isinstance(). 语法 以下是 isinstance() 方法的语法: isinstance(object, classinfo)