1. 程式人生 > 其它 >七、面向物件_6.super()

七、面向物件_6.super()

super()

super(當前類名,self).func() / super().func()
        功能:呼叫父類方法

super()可以自動查詢父類,呼叫遵循__mro__類屬性的順序,比較適合單繼承使用
class Ronaldinho(object):
    def __init__(self):
        self.skill = '牛尾巴'

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

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

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

        # 方法二:super()
        # 1.super(當前類名,self).func()
        # super(Messi,self).__init__()
        # super(Messi,self).play_soccer()

        # 2.super(當前類名,self).func()
        super().__init__()
        super().play_soccer()

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

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

    def play_ronaldinho_soccer(self):
        Ronaldinho.__init__(self)
        Ronaldinho.play_soccer(self)

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

    # 一次性呼叫父類同名屬性和方法
    def play_old_soccer(self):

        # 方法一:
        # 缺點:1.如果父類名更改,此處也需要修改  2.如果父類很多則程式碼量過大
        # Ronaldinho.__init__(self)
        # Ronaldinho.play_soccer(self)
        # Messi.__init__(self)
        # Messi.play_soccer(self)

        # 方法二:super()
        # 1.super(當前類名,self).func()
        # super(Neymar,self).__init__()
        # super(Neymar,self).play_soccer()

        # 2.super().func()
        super().__init__()
        super().play_soccer()

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

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