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

  • 相关阅读:
    我是一条内存[转]
    随机翻唱辑 [2006.8.18更新]
    CentOS NTFS 挂载
    grub备忘
    CentOS 使用163软件源
    被车撞了
    爱上苦瓜
    无聊的游戏
    今天去爬山了
    博客搬家了:www.sanv.org
  • 原文地址:https://www.cnblogs.com/featherw/p/10335460.html
Copyright © 2011-2022 走看看