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

来源:https://www.cnblogs.com/djdjdj123/archive/2023/05/22/17421598.html
-Advertisement-
Play Games

### 子類調用父類的方法的三種方式: - 父類名.方法名(self) - super(子類名,self).父類方法名() - super().父類方法名 註意:super()通過子類調用當前父類的方法,super預設會調用第一個父類的方法(適用於單繼承的多層繼承 如下代碼: ```python # ...


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

  • 父類名.方法名(self)

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

  • 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()

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
#Python小白學習交流群:711312441
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類自己的構造方法(等同於重寫第一個直接父類的構造方法),但是需要註意的是,在子類中定義構造方法,則必須在該方法中調用父類的構造方法。

  • 未綁定方式
  • 使用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類的構造方法,只能使用未綁定方法


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • HTTP 1.1相比HTTP 1.0具有以下優點: 1. 持久連接 :HTTP 1.1引入了持久連接機制,允許多個請求和響應復用同一個TCP連接。這樣可以減少建立和關閉連接的開銷,提高性能和效率。2. 流水線處理 :HTTP 1.1支持流水線處理,即可以同時發送多個請求,不需要等待前一個請求的響應。 ...
  • 參考:[Building a WebGL Carousel with React Three Fiber and GSAP](https://tympanus.net/codrops/2023/04/27/building-a-webgl-carousel-with-react-three-fibe ...
  • ## 一、模式動機 迭代器模式(Iterator Pattern)是一種使用頻率非常高的行為型設計模式,**迭代器**用於**對一個聚合對象進行遍歷**。通過**引入迭代器**可以**將數據的遍歷功能從聚合對象中分離出來**,**聚合對象只負責存儲數據**,而**遍曆數據由迭代器來完成**,簡化了聚 ...
  • 之前總聊微服務,今天換一個話題---低代碼。低代碼這個詞也是最近這幾年很火的概念,尤其是遇到大環境下行,很多大廠和互聯網那個公司也在慢慢在低代碼方向發力,當然,對於傳統項目交付型的軟體公司,低代碼也具有相當大的吸引力。 ...
  • 不同團隊落地DDD所採取的應用架構風格可能不同,並沒有統一的、標準的DDD工程架構。即使無法制定通用的、標準的工程應用架構,但為團隊制定一個遵循領域驅動設計思想的參考架構依然有價值。 ...
  • 今天又是摸魚的一天,在群里閑聊的時候突然有位群友題了個問題: ![](https://img2023.cnblogs.com/blog/2696704/202305/2696704-20230522233309409-1620806525.png) 群友們反應很快,一下子就解決了沒有加關鍵字vola ...
  • # 前言 Java 中的三元運算,平時也叫做三目運算,大家瞭解嗎?下麵就詳細介紹一下,以後在項目編程中用得到。 # 一、Java運算符 在最底層,Java 中的數據是通過使用運算符來操作的。運算符是一種特殊的符號,用來表示數據的運算、賦值和比較等等。每一種編程語言都有運算符,在 Java 中運算符可 ...
  • 視頻地址 # 1 Stream流概述 - 目的:簡化集合和數組操作的API,結合了Lambda表達式。 - Stream流式思想的核心: 1. 先得到集合或者數組的Stream流(就是一根傳送帶) 2. 把元素放上去 3. 用這個Stream流簡化的API來方便的操作元素 # 2 Stream流獲取 ...
一周排行
    -Advertisement-
    Play Games
  • 概述:本文代碼示例演示瞭如何在WPF中使用LiveCharts庫創建動態條形圖。通過創建數據模型、ViewModel和在XAML中使用`CartesianChart`控制項,你可以輕鬆實現圖表的數據綁定和動態更新。我將通過清晰的步驟指南包括詳細的中文註釋,幫助你快速理解並應用這一功能。 先上效果: 在 ...
  • openGauss(GaussDB ) openGauss是一款全面友好開放,攜手伙伴共同打造的企業級開源關係型資料庫。openGauss採用木蘭寬鬆許可證v2發行,提供面向多核架構的極致性能、全鏈路的業務、數據安全、基於AI的調優和高效運維的能力。openGauss深度融合華為在資料庫領域多年的研 ...
  • openGauss(GaussDB ) openGauss是一款全面友好開放,攜手伙伴共同打造的企業級開源關係型資料庫。openGauss採用木蘭寬鬆許可證v2發行,提供面向多核架構的極致性能、全鏈路的業務、數據安全、基於AI的調優和高效運維的能力。openGauss深度融合華為在資料庫領域多年的研 ...
  • 概述:本示例演示了在WPF應用程式中實現多語言支持的詳細步驟。通過資源字典和數據綁定,以及使用語言管理器類,應用程式能夠在運行時動態切換語言。這種方法使得多語言支持更加靈活,便於維護,同時提供清晰的代碼結構。 在WPF中實現多語言的一種常見方法是使用資源字典和數據綁定。以下是一個詳細的步驟和示例源代 ...
  • 描述(做一個簡單的記錄): 事件(event)的本質是一個委托;(聲明一個事件: public event TestDelegate eventTest;) 委托(delegate)可以理解為一個符合某種簽名的方法類型;比如:TestDelegate委托的返回數據類型為string,參數為 int和 ...
  • 1、AOT適合場景 Aot適合工具類型的項目使用,優點禁止反編 ,第一次啟動快,業務型項目或者反射多的項目不適合用AOT AOT更新記錄: 實實在在經過實踐的AOT ORM 5.1.4.117 +支持AOT 5.1.4.123 +支持CodeFirst和非同步方法 5.1.4.129-preview1 ...
  • 總說周知,UWP 是運行在沙盒裡面的,所有許可權都有嚴格限制,和沙盒外交互也需要特殊的通道,所以從根本杜絕了 UWP 毒瘤的存在。但是實際上 UWP 只是一個應用模型,本身是沒有什麼許可權管理的,許可權管理全靠 App Container 沙盒控制,如果我們脫離了這個沙盒,UWP 就會放飛自我了。那麼有沒... ...
  • 目錄條款17:讓介面容易被正確使用,不易被誤用(Make interfaces easy to use correctly and hard to use incorrectly)限制類型和值規定能做和不能做的事提供行為一致的介面條款19:設計class猶如設計type(Treat class de ...
  • title: 從零開始:Django項目的創建與配置指南 date: 2024/5/2 18:29:33 updated: 2024/5/2 18:29:33 categories: 後端開發 tags: Django WebDev Python ORM Security Deployment Op ...
  • 1、BOM對象 BOM:Broswer object model,即瀏覽器提供我們開發者在javascript用於操作瀏覽器的對象。 1.1、window對象 視窗方法 // BOM Browser object model 瀏覽器對象模型 // js中最大的一個對象.整個瀏覽器視窗出現的所有東西都 ...