zoukankan      html  css  js  c++  java
  • 【摘】人生苦短, 每日python

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

  • 相关阅读:
    百度Apollo安装说明
    Ubuntu 16.04 kinetic 下安装turtlebot2
    三维点云地图构建方法
    jupyter中添加conda环境
    Pyplot教程(深度学习入门3)
    linux下安装tomcat,部署项目
    linux下修改系统时间
    手把手集成web端手写公式功能
    如何查看端口是被哪个程序占用的
    Bootstrap的优先级、选择器、伪类
  • 原文地址:https://www.cnblogs.com/featherw/p/10335460.html
Copyright © 2011-2022 走看看