日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

面向对象编程03—封装、继承、重写、MRO、多态

發布時間:2024/9/30 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 面向对象编程03—封装、继承、重写、MRO、多态 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

九、封裝

根據需求將屬性和方法封裝到一個抽象的類中,在使用的時候,只要按照自己的需求去調用,不必了解實現的細節。

封裝有兩方面的含義:

1、將數據(屬性)和行為(方法)包裝到類對象中。在方法內部對屬性進行操作,在類對象的外部調用方法。這樣,無需關心方法內部的具體實現細節,從而隔離了復雜度。
2、在類對象的內部通過訪問控制把某些屬性和方法隱藏起來,不允許對類對象的外部直接訪問,而是在類對象的內部對外提供公開的接口方法以訪問隱藏的信息。這樣,就對隱藏的信息進行了保護。

class Student(object):def __init__(self):self.score=90def get_score(self):return self.__scoredef set_score(self,score):if 0<=score<=100:self.__score=scoreelse:raise ValueError("成績必須在0~100之間")

十、繼承

繼承是實現代碼復用的重要手段

當幾個類對象中有共同的屬性和方法時,就可以把這些屬性和方法抽象并提取到一個基類中,每個類對象特有的屬性和方法還是在本類對象中定義,這樣,只需要每個類對象都繼承這個基類,就可以訪問基類中的屬性和方法了。繼承基類的每個類對象被稱為派生類。基類也被稱為父類或超類,派生類也被稱為子類。

單繼承:子類只有一個直接父類
假設子類和父類分別為ChildClass和ParentClass,子類繼承父類的語法格式為:

class ChildClass(ParentClass):pass

多繼承:子類有多個直接父類
假設子類是ChildClass,直接父類是ParentClass1,ParentClass2,…ParentClassn,子類繼承父類的語法格式:

class ChildClass(ParentClass1,ParentClass2,......ParentClassn)pass

子類會繼承所有父類(包括所有直接父類和所有間接父類)的所有屬性和方法。

class ParentClassA(object):ca = 18def im(self):print("im()被調用了") class PrentClassB(object):__pac =23def __pim(self):print("__pim()被調用了") class PrentClassC(ParentClassA,PrentClassB):@classmethoddef cm(cls):print("cm()被調用了") class ParentClassD(object): @classmethoddef sm():print("sm()被調用了")

子類可以添加父類中沒有的屬性和方法,

class BaseClass(object):ca_base = 5def im_base(self):print("im_base()被調用了") class SubClass(BaseClass):ca_sub = 8def im_sub(self):print("im_sub()被調用了") print(dir(SubClass))

十一、重寫

1、如果子類對繼承自父類的某個屬性或方法不滿意,可以在子類中對其進行重寫從而提供自定義的實現,重寫的方式:在子類中定義與父類中同名的屬性和方法(包括裝飾器)。
2、子類重寫父類的屬性或方法后,通過子類或其實例對象只能訪問子類中重寫的屬性或方法,而無法再訪問父類中被重寫的方法。

父類中被重寫的名為xxx的方法,在子類重寫后的方法中可以通過super().xxx進行調用。

class PrentClass(object):ca = "ca(父類)"def __init__(self):print("__init__()被調用了(父類)")def im(self):print("im()被調用了(父類)")@classmethoddef cm(cls):print("cm()被調離了(父類)")class ChildClass(object):ca = "ca(子類)"def __init__(self):super().__init__()print("__init__()被調用了(子類)")def im(self):super().im()print("im()被調用了(子類)")@classmethoddef cm(cls):super().cm()print("cm()被調離了(子類)")

十二、MRO(方法解析順序)

MRO指的是對于一棵類繼承樹,當調用最底層類對象所對應實例對象的方法時,python解釋器在類繼承樹上搜索方法的順序。
對于一棵類繼承樹,可以調用最底層類對象的方法mro或訪問最底層類對象的特殊屬性__mro__,獲得這顆類繼承樹的MRO.

class A(object):def f(self):print("A.f") class B(A):def f(self):print("B.f") class C(A):def f(self):print("C.f") class D(B,C):def f(self):print("D.f")

在子類重寫后的方法中通過super()調用父類中被重寫的方法時,在父類中搜索方法的順序基于以該子類為最底層類對象的類繼承樹MRO。
如果想調用指定父類中被重寫的方法,可以給super()傳入兩個實參:super(a_type,abj),其中,obj所對應類對象的MRO中,a_type后面那個類對象。

十三、多態

——在不考慮對象類型的情況下使用的對象

class ParentClass(object):def do_sth(self):print("do_sth() in ParentClass")class ChildClass1(ParentClass):def do_sth(self):print("do_sth() in ChildClass1")class ChildClass2(ParentClass):def do_sth(self):print("do_sth() in ChildClass2") def f(parent):parent.do_sth()

簡單地說,多態就是“具有多種形態”,它指的是:即便不知道一個變量所引用的對象到底是什么類型,仍然可以通過這個變量調用方法,在運行過程中根據變量所引用對象的類型,動態地決定調用哪個對象中的方法。

如果子類中不存在指定名稱的方法,回到父類中去查找,如果在父類中找到了,則調用父類中的方法。

class ChildClass3(ParentClass):pass

鴨子類型:
如果一只生物走起來像鴨子,游起泳來像鴨子,叫起來也像鴨子,那么它就可以被當做鴨子。
也就是說,它不關注對象的類型,而是關注對象具有的行為。

注:嵩天老師《python及其應用》筆記

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的面向对象编程03—封装、继承、重写、MRO、多态的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。