面向对象编程03—封装、继承、重写、MRO、多态
九、封裝
根據需求將屬性和方法封裝到一個抽象的類中,在使用的時候,只要按照自己的需求去調用,不必了解實現的細節。
封裝有兩方面的含義:
1、將數據(屬性)和行為(方法)包裝到類對象中。在方法內部對屬性進行操作,在類對象的外部調用方法。這樣,無需關心方法內部的具體實現細節,從而隔離了復雜度。
2、在類對象的內部通過訪問控制把某些屬性和方法隱藏起來,不允許對類對象的外部直接訪問,而是在類對象的內部對外提供公開的接口方法以訪問隱藏的信息。這樣,就對隱藏的信息進行了保護。
十、繼承
繼承是實現代碼復用的重要手段
當幾個類對象中有共同的屬性和方法時,就可以把這些屬性和方法抽象并提取到一個基類中,每個類對象特有的屬性和方法還是在本類對象中定義,這樣,只需要每個類對象都繼承這個基類,就可以訪問基類中的屬性和方法了。繼承基類的每個類對象被稱為派生類。基類也被稱為父類或超類,派生類也被稱為子類。
單繼承:子類只有一個直接父類
假設子類和父類分別為ChildClass和ParentClass,子類繼承父類的語法格式為:
多繼承:子類有多個直接父類
假設子類是ChildClass,直接父類是ParentClass1,ParentClass2,…ParentClassn,子類繼承父類的語法格式:
子類會繼承所有父類(包括所有直接父類和所有間接父類)的所有屬性和方法。
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.
在子類重寫后的方法中通過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、多态的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 面向对象编程02—装饰器、类方法、静态方
- 下一篇: 面向对象编程04