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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...