python 之 面向對象基礎(繼承與派生,經典類與新式類)

来源:https://www.cnblogs.com/mylu/archive/2019/07/03/11129362.html
-Advertisement-
Play Games

7.2 繼承與派生 7.21繼承 1、什麼是繼承? 繼承是一種新建類的的方式,在python中支持一個子類繼承多個父類。新建的類稱為子類或者派生類,父類又可以稱為基類或者超類,子類會”遺傳“父類的屬性。 2、為什麼要用繼承 減少代碼冗餘 3、繼承是類與類之間的關係,尋找這種關係需要先抽象再繼承 7. ...


7.2 繼承與派生

7.21繼承

1、什麼是繼承? 繼承是一種新建類的的方式,在python中支持一個子類繼承多個父類。新建的類稱為子類或者派生類,父類又可以稱為基類或者超類,子類會”遺傳“父類的屬性。


2、為什麼要用繼承 減少代碼冗餘

class ParentClass1:
    pass
class ParentClass2:
    pass
class Subclass1(ParentClass1):
    pass
class Subclass2(ParentClass1,ParentClass2):
    pass
print(Subclass1.__bases__)  #(<class '__main__.ParentClass1'>,)
print(Subclass2.__bases__)  #(<class '__main__.ParentClass1'>, <class '__main__.ParentClass2'>)

3、繼承是類與類之間的關係,尋找這種關係需要先抽象再繼承

class OldboyPeople:
    school = 'oldboy'def __init__(self, name, age, sex):
        self.name = name
        self.age = age
        self.sex = sex
​
class OldboyTeacher(OldboyPeople):          #繼承OldboyPeople類
    def change_score(self):
        print('teacher %s is changing score' %self.name)
​
class Oldboystudent(OldboyPeople):          #繼承OldboyPeople類
    def choose(self):
        print('student %s choose course' %self.name)
​
tea1 = OldboyTeacher('egon', 18, 'male') # 相當於OldboyTeacher.__init__(...)
stu1=Oldboystudent('alex',73,'female')
​
print(tea1.name,tea1.age,tea1.sex)          #egon 18 male
print(stu1.name,stu1.age,stu1.sex)          #alex 73 female

7.22 派生

派生:子類定義自己新的屬性,如果與父類同名,以子類自己的為準

class OldboyPeople:
    school = 'oldboy'
    def __init__(self, name, age, sex):
        self.name = name
        self.age = age
        self.sex = sex
    def f1(self):
        print('爹的f1')
class OldboyTeacher(OldboyPeople):
    def __init__(self,name,age,sex,level,salary):
        self.name=name
        self.age=age
        self.sex=sex
        self.level=level
        self.salary=salary
    def change_score(self):
        print('teacher %s is changing score' %self.name)
    def f1(self):
        print('兒子的f1')
tea1 = OldboyTeacher('egon', 18, 'male',9,3.1)             #傳入6個參數,如果傳入父類ze報錯
print(tea1.name,tea1.age,tea1.sex,tea1.level,tea1.salary)   #egon 18 male 9 3.1

7.23 在子類派生出的新方法中重用父類的功能

方式一:指名道姓地調用(與繼承沒有什麼關係

class OldboyPeople:
    school = 'oldboy'
    def __init__(self, name, age, sex):
        self.name = name
        self.age = age
        self.sex = sex
        
class OldboyTeacher(OldboyPeople):    #可有可無
    def __init__(self, name, age, sex, level, salary):
        # self.name = name
        # self.age = age
        # self.sex = sex
        OldboyPeople.__init__(self,name, age, sex)#用 OldboyPeople調用__init__的方式重用父類功能
        self.level = level
        self.salary = salary
​
tea1 = OldboyTeacher('egon', 18, 'male', 9, 3.1)
print(tea1.name, tea1.age, tea1.sex, tea1.level, tea1.salary) #egon 18 male 9 3.1

方式二:super()調用(嚴格依賴於繼承

super ( ) 的返回值是一個特殊的對象,該對象專門用來調用父類中的屬性,super()會嚴格按照mro列表從當前查找到的位置繼續往後查找

瞭解:在python2中,需要super(自己的類名,self)

class OldboyPeople:
    school = 'oldboy'
    def __init__(self, name, age, sex):
        self.name = name
        self.age = age
        self.sex = sex
​
class OldboyTeacher(OldboyPeople):      #必須有父類
    def __init__(self, name, age, sex, level, salary):
        super(OldboyTeacher,self).__init__(name,age,sex)# OldboyPeople.__init__(self,name, age,sex) 
        self.level = level
        self.salary = salary
​
tea1 = OldboyTeacher('egon', 18, 'male', 9, 3.1)
print(tea1.name, tea1.age, tea1.sex, tea1.level, tea1.salary)   #egon 18 male 9 3.1

7.3 經典類與新式類

1、新式類: 繼承object的類,以及該類的子類,都是新式類

在python3中,如果一個類沒有指定繼承的父類,預設就繼承object,所以說python3中所有的類都是新式類

2、經典類(只有在python2才區分經典類與新式類):沒有繼承object的類,以及該類的子類,都是經典類

class Foo():               #在python3中
    passclass Bar(Foo):
    passprint(Foo.__bases__)        #(<class 'object'>,)
print(Bar.__bases__)        #(<class '__main__.Foo'>,)

7.34 在多繼承背景下的屬性查找

屬性查找
   obj.x
   1、先從obj.__dict__
   2、對象的類.__dict__
   3、父類.__dict__
  ..........

如果繼承關係為非菱形結構,則會按照先找B這一條分支,然後再找C這一條分支,最後找D這一條分支的順序直到找到我們想要的屬性

如果繼承關係為菱形結構,那麼屬性的查找方式有兩種,分別是:深度優先和廣度優先

print(F.__mro__) # F.mro()  #只有新式類才有這個屬性可以查看線性列表,查看屬性查找順序,經典類沒有這個屬性

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

-Advertisement-
Play Games
更多相關文章
  • 1題目:在一個二維數組中(每個一維數組的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。 2思路:首先選取數組中右上角的數字。如果該數字等於要查找的數字,查找過程結束;如果該數字大於要查找 ...
  • 一、基礎案例 1、基礎案例概覽 歷時一個半月,SpringBoot2.0基礎案例的文章基本更新完畢了,基礎案例包含了SpringBoot的基礎教程,高級應用,日誌配置,資料庫使用,事務管理等。關於SpringBoot2.0的基礎案例就更新到這裡了,後續會更新SpringBoot2.0和各種中間件的整 ...
  • 單列集合框架體系 List 集合體系 主要實現類 依次為 ArrayList,LinkedList,Vector 。 List介面主要特征: 有序,可重覆,有索引,底層容量是動態擴容的。(代碼以JDK 1.8為例) ArrayList:是List介面的主要實現類,底層用數組實現: ,transien ...
  • 簡介: 使用Springboot應用,選中需要的模塊, Spring已經預設將場景配置好了,只需在配置文件中少量配置就可以運行起來 自己編寫業務代碼 自動配置原理 這個場景Springboot幫我們配置了什麼、能不能修改呢?能修改哪些配置? xxxxxAutoConfiguration :幫我們給容 ...
  • 占位符% %s (str類型占位) %d(digit,int類型占位) 案例: name = input('請輸入您的姓名:') age = input('您的年齡:') job = input('您的工作:') hobbie = input('您的愛好:') mag = ''' info of % ...
  • 項目地址: "https://github.com/PythonerKK/django generate pdf/tree/master" 這個demo實現了通過用戶輸入自己的個人信息生成一份簡歷pdf,來闡述如何使用Django的HttpResponse生成PDF的文檔。 先上效果圖: 安裝依賴庫 ...
  • 有限狀態自動機(FSM):是一種表達某一狀態到另一狀態發生轉化的數學模型。 例如:在長跑比賽開始時 我處於等待的狀態下,待裁判喊 預備 時,我就會從等待狀態轉換到預備狀態。聽到裁判的槍聲時,我就從預備狀態轉換到奔跑狀態 。這個過程就相當於有限狀態自動機。 FSM的狀態就是一個事件當前所處於的情況。 ...
  • [toc] Django 使用 markdown 插件 Python Markdown 插件 安裝 1 將 markdown 轉化為 html models templates: 此時,模板中通過 將 中的 markdown 文本轉化為 html 在前臺頁面顯示。 2 使用 markdown 編輯框 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...