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. Java 查找Panel 里的某个组件 比如 按钮

    遇到到一个需求,需要获取界面里的一个按钮,但是这个按钮是封装的父类嵌入的,知道label 的值. 写了一个递归获取它 1 private JButton LookupTheButton(Compone ...

  2. linux 复合页( Compound Page )的介绍

    1.复合页的定义: 复合页(Compound Page)就是将物理上连续的两个或多个页看成一个独立的大页,它可以用来创建hugetlbfs中使用的大页(hugepage),  也可以用来创建透明大页( ...

  3. windows 设置网卡跳跃点

    查看路由表route print -4 添加永久路由表:192.168.1.1(网关)route add 0.0.0.0 mask 255.255.255.0 192.168.1.1 metric 1 ...

  4. 《Python深度学习》《卷积神经网络的可视化》精读

    对于大多数深度学习模型,模型学到的表示都难以用人类可以理解的方式提取和呈现.但对于卷积神经网络来说,我们可以很容易第提取模型学习到的表示形式,并以此加深对卷积神经网络模型运作原理的理解. 这篇文章的内 ...

  5. 有null值的子查询,子查询加排序,速度大幅提升

    意外发现,如果子查询结果有大量null值,加上一个排序,最后查询速度飞起

  6. Vue+element ui 笔记

    1)可以直接拿过来就用的样式 https://www.cnblogs.com/xiao987334176/p/14188413.html 2)对Table里面的每一项全部设定为选中 mounted() ...

  7. tfidf与bm25

    https://www.cnblogs.com/johnnyzen/p/11298273.html 前言 本文主要是对TF-IDF和BM25在公式推演.发展沿革方面的演述,全文思路.图片基本来源于此篇 ...

  8. 实战记录在 Linux Ubuntu 20.04 安装VNC 远程桌面

    Virtual Network Computing (VNC),是一个图形桌面共享系统,允许我们像使用Windows桌面系统一样可视化的使用键盘和鼠标远程控制服务器,当做一台远程的电脑一样. 主要用在 ...

  9. 裁员潮下,我月薪3W依旧坚挺

    近几年来产品经理一直是求职市场中的香饽饽: 年薪20w起.没有专业限制.职业天花板高,甚至行业中一直流传着一句话:产品经理是CEO的学前班. 在各种光环的加持下,不少应届生或有转行打算的职场人都将目光 ...

  10. HTML学习笔记1----HTML是什么

    随笔记录方便自己和同路人查阅. #------------------------------------------------我是可耻的分割线--------------------------- ...