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

原文地址:https://www.cnblogs.com/botoo/p/8822071.html