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

最新文章

  1. Arduino 翻译系列 - LED 灯闪烁
  2. 一个简单的scrapy爬虫抓取豆瓣刘亦菲的图片地址
  3. mongodb子文档查询
  4. HDU 2897 邂逅明下 (简单博弈,找规律)
  5. Codeforces 710 E. Generate a String (dp)
  6. A Tour of Go Exercise: HTTP Handlers
  7. webpy:页面下载的三种实现方式
  8. 对arm指令集的疑惑,静态库运行,编译报错等问题
  9. YII 实现布局
  10. 大概是:整数划分||DP||母函数||递推
  11. hdu4821 String
  12. iOS 9 HTTPS 的配置
  13. Vmware安装CentOs7+gitlab(二)
  14. JavaScript面向对象--封装
  15. Go 字符串连接+=与strings.Join性能对比
  16. leetcode 104. Maximum Depth of Binary Tree 111. Minimum Depth of Binary Tree
  17. ElasticSearch5.X的冷热数据架构
  18. inf 启动
  19. 【5】JMicro微服务-熔断降级
  20. jenkins+pytest+ allure运行多个py文件测试用例

热门文章

  1. 从软件测试转型到C#上位机程序员
  2. 配置两个Hadoop集群Kerberos认证跨域互信
  3. google搜索引擎使用
  4. BZOJ-3105: 新Nim游戏 (nim博弈&amp;线性基)
  5. javaWeb-Servlet工作原理
  6. laravel seed填充数据步骤
  7. 使用django发布带图片的网页(上)
  8. JAVA for(i = 0; i&lt;a.length; i++) 解析
  9. python实现redis分布式锁
  10. zabbix免客户端监控网站URL