zoukankan      html  css  js  c++  java
  • python基础===继承和多继承

    继承

    class A:
        def spam(self):
            print("A.SPAM")
    
        def add(self, x,y):
            return x+y
    
    class B(A):
        def spam(self):
            """
            如果子类要对父类的方法进行重写,再想调用父类的方法,就需要使用super().方法名() 的形式
            """
            print("B.Spam")
            super().spam() #调用父类的spam()
            
    
    b = B()
    b.spam()    
    print(b.add(8,8))
    
    class C:
        def __init__(self):
            self.x = 100
        def compare(self, num):
            if self.x>num:
                return self.x
            else:
                return num
            
    class D(C):
        def __init__(self):
            super().__init__()   #super() 函数的一个常见用法是在__init__() 方法中确保父类被正确的初始化
            self.x = 300               #更改父类
            self.y = 500
    
    d= D()
    print(d.compare(101))         #300  得到的结果也会更改
    print(d.y)                                 #500
    print(d.x)

     多继承

     http://python.jobbole.com/86787/

    #python中的多继承
    
    class A:
        def foo(self):
            print("A类的方法")
    
    class B:
        def foo(self):
            print("B类的方法")
    
        def foo_1(self):
            print("B类专有的方法")
    
    class C(A,B):
        pass
    
    class D(C, A):
        pass
    
    """
    class D(A, C):
        pass
    会报错:
    TypeError: Cannot create a consistent method resolution
    order (MRO) for bases A, C
    原因分析参考:
    https://www.cnblogs.com/yudy/archive/2013/06/10/3130521.html
    https://www.cnblogs.com/seven777/p/7189932.html
    """
    
    c = C()
    c.foo()
    #>>>A类的方法
    
    c.foo_1()
    #>>>B类专有的方法
    
    d = D()   
    d.foo()
    #>>>A类的方法

    print(D.mro())
    #>>>[<class '__main__.D'>, <class '__main__.C'>, <class '__main__.E'>, <class '__main__.A'>, <class 'object'>]

    总结:

    两个概念:经典类,新式类

    继承搜索的顺序发生了改变,经典类多继承属性搜索顺序: 先深入继承树左侧,再返回,开始找右侧;

    新式类多继承属性搜索顺序: 先水平搜索,然后再向上移动

    参考文章:

    http://python.jobbole.com/86787/

    https://www.zhihu.com/question/266882644

  • 相关阅读:
    国内最火的3款前端开发框架
    Cordova是做什么的
    老师你好。使用cordova生成的hellowold 的安卓5.0版本太高。怎么才可以生成4.4的呢?
    一个类似bootstrap的foundation
    role在标签中的作用是什么?
    如何做到根据不同的进度用不同的颜色显示整个进度条
    wall 和panel有啥区别
    git ignore
    eclipse js 引用跳转
    计划
  • 原文地址:https://www.cnblogs.com/botoo/p/8822071.html
Copyright © 2011-2022 走看看