1. 程式人生 > 其它 >七、面向物件_5.繼承

七、面向物件_5.繼承

繼承

面向物件的繼承指的是多個類之間的所屬關係,即子類預設繼承父類的所有屬性和方法
python中,所有類預設繼承object類,object類是基類,其他子類叫派生類

class.__mro__
        功能:返回 class 的父類繼承關係
單繼承

父類和子類一一對應的繼承

class A(object):
    def __init__(self):
        self.num = 100
    def play_soccer(self):
        print(self.num)

class B(A):
    pass

b = B()
print(b.num)
b.play_soccer()

100
100
多繼承

子類同時繼承多個父類

class Ronaldinho(object):
    def __init__(self):
        self.skill = '牛尾巴'

    def play_soccer(self):
        print(f'技能:{self.skill}')

class Messi(object):
    def __init__(self):
        self.skill = '油炸丸子'

    def play_soccer(self):
        print(f'技能:{self.skill}')
子類中所有屬性和方法都從父類繼承

當一個子類有多個父類,且不同父類中存在同名屬性或方法時,預設使用前面的父類

class Neymar1(Ronaldinho,Messi):
    pass

N1 = Neymar1()
print(N1.skill)
N1.play_soccer()

牛尾巴
技能:牛尾巴
子類中重寫父類同名屬性和方法

如果子類和父類擁有同名屬性或方法,子類建立物件呼叫屬性或方法時,將從子類中呼叫

class Neymar2(Ronaldinho,Messi):
    def __init__(self):
        self.skill = '彩虹'

    def play_soccer(self):
        print(f'技能:{self.skill}')

N2 = Neymar2()
print(N2.skill)
N2.play_soccer()

# class.__mro__
print(Neymar2.__mro__)

彩虹
技能:彩虹
(<class '__main__.Neymar2'>, <class '__main__.Ronaldinho'>, <class '__main__.Messi'>, <class 'object'>)
子類呼叫父類的同名屬性或方法

呼叫父類方法時,為保證其中的屬性也是父類的屬性,必須在呼叫方法前先呼叫父類的屬性初始化
如果在前面呼叫了父類的屬性,父類屬性會覆蓋子類屬性,所以在使用子類屬性前要先呼叫子類初始化

class Neymar(Ronaldinho,Messi):
    def __init__(self):
        self.skill = '彩虹'

    def play_soccer(self):
        # 如果不加子類初始化,此處skill屬性值將是上一次呼叫的__init__()內的skill屬性值
        self.__init__()
        print(f'技能:{self.skill}')

    # 把父類的同名屬性和方法再次封裝
    def play_ronaldinho_soccer(self):
        # 想要呼叫父類的同名屬性和方法,該屬性在父類__init__()初始化位置,所以需要再次呼叫父類中的__init__()初始化
        Ronaldinho.__init__(self)
        Ronaldinho.play_soccer(self)

    def play_messi_soccer(self):
        Messi.__init__(self)
        Messi.play_soccer(self)

N = Neymar()
N.play_soccer()
N.play_ronaldinho_soccer()
N.play_messi_soccer()
N.play_soccer()

技能:彩虹
技能:牛尾巴
技能:油炸丸子
技能:彩虹
多層繼承
class NewKing(Neymar):
    pass
who = NewKing()
print(who.skill)
who.play_soccer()
who.play_ronaldinho_soccer()
who.play_messi_soccer()

彩虹
技能:彩虹
技能:牛尾巴
技能:油炸丸子