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高级编程》

【摘】python和它的super的更多相关文章

  1. python 继承中的super

    python继承中子类访问父类的方法(包括__init__)主要有两种方法,一种是调用父类的未绑定方法,另一种是使用super(仅仅对于新式类),看下面的两个例子: #coding:utf-8 cla ...

  2. python类中的super,原理如何?MRO是什么东东?

    下面这个URL解释得比较清楚. http://python.jobbole.com/86787/?utm_source=group.jobbole.com&utm_medium=related ...

  3. python singleton design pattern super() 多继承

    python  singleton design pattern decorate baseclass metaclass import module super() 一.A decorator de ...

  4. 【python】class之super关键字的作用

    在Python类的方法(method)中,要调用父类的某个方法,在Python 2.2以前,通常的写法如代码段1: 代码段1: class A: def __init__(self):    prin ...

  5. python Parent.__init()和super(Child, self)的区别

    super函数做的事情 def supper(cls, inst): mro = inst.__class__.mro() return mro[mro.index(cls) + 1] inst生成父 ...

  6. Python面试题之Super函数

    这是个高大上的函数,在python装13手册里面介绍过多使用可显得自己是高手 23333. 但其实他还是很重要的. 简单说, super函数是调用下一个父类(超类)并返回该父类实例的方法. 这里的下一 ...

  7. Python面试题之Python和Java中Super方法的区别

    python 的 super 是一个函数,需要两个参数,第一个参数是类,第二个参数是实例,返回值是一个类对象. 其意义是:站在参数2这个实例的角度看去, 参数1这个类的‘父亲’是谁,把‘父亲’返回. ...

  8. [Python]面向对象近期笔记-super

    Python面向对象高级 直接调用父类方法 class A: def __init__(self): print("hello") class B(A): def __init__ ...

  9. Python 内置函数--super()

    描述 super() 函数是用于调用父类(超类)的一个方法. super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO).重复 ...

  10. Python 内置函数super

    super()函数是用于调用父类/超类的一个方法 super是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没有问题,但是如果使用多继承,会涉及到查找顺序(MRO),重复调用(钻石继 ...

随机推荐

  1. 兼容ie8的Html+Css+Js

    1 <!DOCTYPE html> 2 <html lang="en"> 3 4 <head> 5 <meta charset=" ...

  2. OTP: gen_server的简单应用

    1.确定回调模块名 2.编写接口函数 3.在回调模块里编写六个必需的回调函数 1.确定回调模块名 my_bank 2.编写接口方法 start() 打开银行 stop() 关闭银行 new_accou ...

  3. DAC双通道模板

    #define DAC_C #include "dac.h" float DAC_DispenseA; float DAC_DispenseB; void MyDAC_Init(v ...

  4. html的table多级表头表格的代码

    1,两级表头的代码 <html> <head> <title>多层表头</title> <link rel="stylesheet&qu ...

  5. linux下第三方库的配置和链接——以opencv为例

    安装OpenCV(可参考链接) 下载source到 /usr/local/路径下 新建 /build/ cmake 编译 添加库路径 vim /etc/ld.so.conf 该目录作用参考链接 输入: ...

  6. vi 快捷键/ctags

    vi 配置 syntax enableset nu set relativenumberset hlsearch set autoindentset shiftwidth=4set tabstop=4 ...

  7. oracle WMSYS.WM_CONCAT 函数使用

    1.用法 WMSYS.WM_CONCAT(要连接的字段) 该函数返回来自同一个分组的指定字段的非NULL值的连接起来字符串,默认逗号连接,一般搭配分组函数使用 2.示例 select XFJ_ID,R ...

  8. sql server 常用高级查询sql

    数据源:表:coursename kecheng fenshu张三 语文 81张三 数学 75李四 语文 76李四 数学 90王五 语文 81王五 数学 100王五 英语 90赵六 语文 88赵六 数 ...

  9. 样本方差S²中为什么是乘以1/(n-1)或者说除以n-1?贝塞尔校正,无偏估计

    样本方差S²中为什么是乘以1/(n-1)或者说除以n-1?贝塞尔校正,无偏估计 前言:重在记录,可能出错. 先看样本方差的公式如下: S2=1n-1∑i=1n(Xi-X¯)2=1n-1(∑i=1nXi ...

  10. mobx hook中的使用

    class import { inject, observer } from "mobx-react"; // 需要使用mobx-react提供的Provider 包裹,需要使用的 ...