python 3 基礎之調用父類方法的三種方式(super調用和父類名調用)


1、子類調用父類的方法的三種方式:

  01、父類名.方法名(self)

  02、super(子類名,self).父類方法名()

  03、super().父類方法名

  注意:super()通過子類調用當前父類的方法,super默認會調用第一個父類的方法(適用於單繼承的多層繼承

如下代碼:

# 自定義師傅類-古法
class Master(object):

    # 方法
    def make_cake(self):
        print("古法煎餅果子")
# 自定義師傅類-現代
class School(object):

    # 方法
    def make_cake(self):
        print("現代煎餅果子")
# 自定義一個徒弟類
class Prentice(Master, School):

    # 方法
    def make_cake(self):
        print("貓氏煎餅果子")
        Master.make_cake(self)
        School.make_cake(self)

    # 古法
    def make_old_cake(self):
        # 01 方式(單和多繼承 都適用)
        # Master.make_cake(self)

        # super默認會調用第一個父類的方法(適用於單繼承 或者只想使用第一個父類的方法)

        # 02 方式 適用於新式類
        # 格式: super(子類類名, self).父類方法名()
        # super(Prentice, self).make_cake()

        # 03 方式 (適用於新式類) 02方式的簡寫
        super().make_cake()
    # 現代
    def make_new_cake(self):
        super().make_cake()
# 自定義一個對象 大貓
damao = Prentice()
# 貓氏
damao.make_cake()
# # 古法
# damao.make_old_cake()
# # 現代
# damao.make_new_cake()

   1.1、super()調用父類的構造方法

  如下代碼:

class People:
    def __init__(self, name):
        self.name = name
    def say(self):
        print("我是人,名字為:", self.name)

class Animal:
    def __init__(self, food):
        self.food = food
    def display(self):
        print("我是動物,我吃", self.food)

#People中的name屬性和say()會覆蓋Animal類中的
class Person(People, Animal):
    pass

xiaobai = Person("小白")
#Person類同時繼承People和Animal,其中People在前。
#這意味着,在創建對象xiaobai時,其將會調用從People類繼承來的構造函數,因此上面程序創建xiaobai對象的同時,還要給name屬性進行賦值。
xiaobai.say()
xiaobai.display()

上面代碼運行結果:

我是人,名字為: 小白
Traceback (most recent call last):
AttributeError: 'Person' object has no attribute 'food'
#從Animal類中繼承的display()方法中,需要用到food屬性的值,
#但由於People類的構造方法覆蓋了Animal類的構造方法,使得在創建xiaobai對象時,Animal類的構造方法未得到執行,所以程序出錯。

針對這種情況,正確的做法是定義Person類自己的構造方法(等同於重寫第一個直接父類的構造方法),但是需要注意的是,在子類中定義構造方法,則必須在該方法中調用父類的構造方法。

  1. 未綁定方式
  2. 使用super()函數,但如果涉及多繼承,該函數只能調用第一個直接父類的構造方法。
也就是說,涉及到多繼承時,在子類構造函數中,調用第一個父類構造方法的方式有以上兩種,而調用其他父類構造方法的方式只能使用未綁定方法。
class People:
    def __init__(self, name):
        self.name = name
    def say(self):
        print("我是人,名字為:", self.name)
class Animal:
    def __init__(self, food):
        self.food = food
    def display(self):
        print("我是動物,我吃", self.food)
class Person(People, Animal):
    #自定義構造方法
    def __init__(self, name, food):
        #調用第一個父類的構造方法
        super().__init__(name)
        #People.__init__(self, name)使用未綁定方法調用第一個父類的構造方法
        #調用其他父類的構造方法,需要手動給self傳值
        Animal.__init__(self, food)
xiaobai = Person("xiaobai", "熟食")
xiaobai.say()
xiaobai.display()

運行結果:

我是人,名字為: xiaobai
我是動物,我吃 熟食

可以看到,Person類自定義的構造方法中,調用People類構造方法,可以使用super()函數,也可以使用未綁定方法。但是調用Animal類的構造方法,只能使用未綁定方法

 

super() 調用父類的構造方法這一段參考自:https://www.cnblogs.com/xiaobaizzz/p/12229429.html




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM