聊一聊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))
你会发现,结果是一样的————而且会引出一个十分重要的知识点:元类/惊恐/惊恐/惊恐

聊一聊isinstance与type的更多相关文章

  1. python isinstance()与type()的区别

    例如在继承上的区别: isinstance() 会认为子类是一种父类类型,考虑继承关系. type() 不会认为子类是一种父类类型,不考虑继承关系. class A: pass class B(A): ...

  2. 方法和函数,isinstance/issubclass/type以及反射

    一丶,isinstance/issubclass/type 1.issubclass检查第一个参数是否是第二个参数的 子子孙孙类 class Foo(): pass class Boo(Foo): p ...

  3. python之反射机制与callattr()、issubclass()、isinstance、type()相关

    一.反射机制 * 反射可以理解为 通过字符串的形式,动态导入模块: 利用字符串的形式,在对象(模块)中操作(查找/获取/删除/添加)成员,是一种基于字符串的事件驱动! 反射机制的内置函数 # hasa ...

  4. isinstance与type的区别

    1.isinstance()内置函数 python中的isinstance()函数是python的内置函数,用来判断一个函数是否是一个已知类型.类似type. 2.用法: isinstance(obj ...

  5. 【我要学python】MethodType和isinstance和Type函数

    一.首先来看isinstance: a=6 isinstance(a,int) #返回Ture isinstance(a,str) #返回False isinstance (a,(str,int,li ...

  6. isinstance/issubclass/type的区别?

    type() 判断某个对象是否是该类创建的,只看一层,如果是继承类,也不会考虑继承类的类型.. Issubclass() 判断该类是否是另一个类的派生类,也就是子类,参数为类. isinstance( ...

  7. isinstance 和 type 的区别

    class A: pass class B(A): pass isinstance(A(), A) # returns True type(A()) == A # returns True isins ...

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

    一.面向对象中特殊方法的补充 1.__str__ 能将对象名改成你想要的字符串,但是类型还是类 class Foo(object): def __init__(self): pass def func ...

  9. 【学习总结】Python-3- 类型判断之 isinstance 和 type 的区别

    菜鸟教程-Python3-基本数据类型 关于类型查询: type() 函数:可以用来查询变量所指的对象类型 用 isinstance()函数:判断是否是某个类型 两者的区别: type()不会认为子类 ...

随机推荐

  1. 浅谈java中的String、StringBuffer、StringBuilder类的区别以及关系

    在java中最常见的使用就是对字符串的操作:首先先说一下对字符串的理解:字符串就是一连串字符序列,Java提供了String和StringBuffer两个类来封装字符串,并提供一系列方法来操作字符串对 ...

  2. 神州数码HSRP(热备份路由协议)配置

    实验要求:掌握HSRP配置方法 拓扑如下 R1 enable 进入特权模式 config 进入全局模式 hostname R1 修改名称 interface g0/6 进入端口 ip address ...

  3. ORACLE11G R2 RAC的进程启动流程

    简要说明ORACLE11GR2 RAC的进程启动流程: 1.启动流程概览图: 二.RAC启动流程的梳理: 第一层:OHASD 启动:(OHASD派生) 1.CSSDAGENT负责启动CSSD的AGEN ...

  4. Python dict(或对象)与json之间的互相转化

    Python dict(或对象)与json之间的互相转化 原文转载自 1.JSON:JavaScript 对象表示法,是轻量级的文本数据交换格式,独立于语言,平台 2.JSON 语法规则 数据在名称/ ...

  5. vue—data中变量和字符串拼接

    #变量和字符串的拼接# 写项目中,遇到了这样的一个问题:怎样在一个div里面显示两个data中的数据?我的问题描述清楚了吗?... 看图吧:   这是用户最初的需求~  这是用户后来的需求,嗯……就是 ...

  6. hive最全学习线路和实践练习

    非原创,源自:https://www.cnblogs.com/snowbook/p/5723767.html hive被大多数企业使用,学习它,利于自己掌握企业所使用的技术,这里从安装使用到概念.原理 ...

  7. ES6的一些知识学习

    一.基础 ES6 - 类: class A{ constructor(name,color){ this.name = name; this.color = color; } toString(){ ...

  8. BOM模型中常用对象 定义计数器 网页跳转 网页前进后退

    今天上午学了的BOM模型中常用对象,了解了一部分的属性 For循环的规律 外层循环控制行 内层循环控制列 <!doctype html> <html> <head> ...

  9. 二.Flask 学习模板

    Flask 为你配置 Jinja2 模板引擎.使用 render_template() 方法可以渲染模板,只需提供模板名称和需要作为参数传递给模板的变量就可简单执行. 至于模板渲染? 简单来说,就是将 ...

  10. nodejs-- vuex中mapActions

    mapActions() 返回的是一个对象, 用了 ... 扩展符后,才可以放进一个对象里,和其他组件内定义的 method 在同一个 methods 对象. { methods: mapAction ...