博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【摘】人生苦短, 每日python
阅读量:5960 次
发布时间:2019-06-19

本文共 1154 字,大约阅读时间需要 3 分钟。

python和它的super

如果用过python2,你一定见过下面这个奇怪的代码

class Mama(object):    def says(self):        print('i am mama')class Sister(Mama):    def says(self):        Mama.says(self)        print('i am sister')if __name__ == '__main__':    sister = Sister()    sister.says()

它的结果是

i am mamai am sister

或者这种奇怪的写法, 不过它只支持继承了object类的

class Sister(Mama):    def says(self):        super(Sister, self).says()        print('i am sister')

python和多重继承的坑

如果你之前没见过下面的这段代码,那你最好运行下

class A(object):    def __init__(self):        print('A')        super(A, self).__init__()class B(object):    def __init__(self):        print('B')        super(B, self).__init__()class C(A, B):    def __init__(self):        print('C'),        A.__init__(self)        B.__init__(self)if __name__ == '__main__':    print('MRO:', [x.__name__ for x in C.__mro__])    print('Calls:')    C()

它的结果是

MRO: ['C', 'A', 'B', 'object']Calls:CABB

虽然A类并未继承B类,但是在C类中的父类关系却是:C继承了A,A继承了B

所以调用A.__init(self)__的时候,不仅仅打印了A,还打印了B
这就导致,B的init被调用了两次

所以我们要

避免多重继承

super的使用必须一致(要么全部用super,要么全不用)
如果代码的使用范围包括python2,在python3中也应该显示地继承自object
调用父类时必须查看类的层次结构

摘自 《Python高级编程》

转载于:https://www.cnblogs.com/featherw/p/10335460.html

你可能感兴趣的文章
两款爱不释手的markdown编辑工具
查看>>
SpringBoot 实战 (五) | 集成 Swagger2 构建强大的 RESTful API 文档
查看>>
Nginx 通过 Lua + Redis 实现动态封禁 IP
查看>>
Element-UI中Upload上传文件前端缓存处理
查看>>
Terraform入门 - 4. destroy 基础设施
查看>>
LeetCode20.有效的括号 JavaScript
查看>>
为什么编程语言的都要定义数据类型
查看>>
深度学习在美团配送ETA预估中的探索与实践
查看>>
Scrapy基本用法
查看>>
后端_服务器
查看>>
手挽手带你学React:三档 React-router4.x的使用
查看>>
vue2.X 解决同一路由跳转只有参数变化的情况下,组件不刷新的问题
查看>>
面试官问我:什么是JavaScript闭包,我该如何回答
查看>>
chrome浏览器下audio自动播放的hack
查看>>
Laravel接入Prometheus
查看>>
Prometheus 500 Internal Privoxy Error 异常解决
查看>>
css选择器
查看>>
vue组件之间8种组件通信方式总结
查看>>
开发者的进阶之路:用语法树来实现预编译
查看>>
跨平台的fswatch+rsync同步备份
查看>>