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 mama
i 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:
C
A
B
B

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

所以调用A.__init(self)__的时候,不仅仅打印了A,还打印了B

这就导致,B的init被调用了两次

所以我们要

避免多重继承

super的使用必须一致(要么全部用super,要么全不用)

如果代码的使用范围包括python2,在python3中也应该显示地继承自object

调用父类时必须查看类的层次结构

摘自 《Python高级编程》

最新文章

  1. [NOIP2016]愤怒的小鸟 D2 T3 状压DP
  2. 洛谷CON1041 NOIP模拟赛一试
  3. Excel导入数据库脚本
  4. 献给那些每次调试时都要启动很多WEB项目的苦逼程序猿
  5. ASP.net绑定文本框Enter事件到按钮 ASP.NET执行后台执行JS方法
  6. DOM(十)使用DOM设置单选按钮、复选框、下拉菜单
  7. 使用JavaScript实现弹出层效果
  8. netbean使用技巧
  9. Gentoo安装
  10. Tk::Table
  11. 3分钟教你做一个iphone手机浏览器
  12. 《java入门第一季》之面向对象(如何使用帮助文档)
  13. 数据库MySQL
  14. 移动 Ubuntu16.04 桌面左侧任务栏到屏幕底部
  15. src路径问题:./ 与 ../
  16. 译:3.消费一个RESTful Web Service
  17. sqlserver生成表结构文档的方法
  18. 在VMware14上安装centos6.5
  19. 怎样消除adobe flash player设置
  20. linux下主从同步和redis的用法

热门文章

  1. 直播平台制作,Android 悬浮窗延时5秒返回APP问题
  2. 【文献阅读】Automatic berthing for an underactuated unmanned surface vehicle: A real-time motion planning approach
  3. Gradle 安装配置
  4. win10格式化U盘提示没有权限执行此操作
  5. error: the option `Z` is only accepted on the nightly compiler
  6. bash脚本的判断语句之一
  7. c基础-Makefile
  8. tomcat前后端项目部署及调优
  9. Div的几种选择器
  10. Dynamics 365 如何代表其他用户发送邮件