物件導向程式設計03 封裝 繼承 重寫 MRO 多型

2021-09-22 21:04:17 字數 4064 閱讀 1233

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

封裝有兩方面的含義:

1、將資料(屬性)和行為(方法)包裝到類物件中。在方法內部對屬性進行操作,在類物件的外部呼叫方法。這樣,無需關心方法內部的具體實現細節,從而隔離了複雜度。

2、在類物件的內部通過訪問控制把某些屬性和方法隱藏起來,不允許對類物件的外部直接訪問,而是在類物件的內部對外提供公開的介面方法以訪問隱藏的資訊。這樣,就對隱藏的資訊進行了保護。

class student(object):

def __init__(self):

self.score=90

def get_score(self):

return self.__score

def set_score(self,score):

if 0<=score<=100:

self.__score=score

else:

raise valueerror("成績必須在0~100之間")

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

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

單繼承:子類只有乙個直接父類

假設子類和父類分別為childclass和parentclass,子類繼承父類的語法格式為:

class childclass(parentclass):

pass

多繼承:子類有多個直接父類

假設子類是childclass,直接父類是parentclass1,parentclass2,…parentclassn,子類繼承父類的語法格式:

class childclass(parentclass1,parentclass2,......parentclassn)

pass

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

class parentclassa(object):

ca = 18

def im(self):

print("im()被呼叫了")

class prentclassb(object):

__pac =23

def __pim(self):

print("__pim()被呼叫了")

class prentclassc(parentclassa,prentclassb):

@classmethod

def cm(cls):

print("cm()被呼叫了")

class parentclassd(object):

@classmethod

def sm():

print("sm()被呼叫了")

子類可以新增父類中沒有的屬性和方法,

class baseclass(object):

ca_base = 5

def im_base(self):

print("im_base()被呼叫了")

class subclass(baseclass):

ca_sub = 8

def im_sub(self):

print("im_sub()被呼叫了")

print(dir(subclass))

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

2、子類重寫父類的屬性或方法後,通過子類或其實例物件只能訪問子類中重寫的屬性或方法,而無法再訪問父類中被重寫的方法。

父類中被重寫的名為***的方法,在子類重寫後的方法中可以通過super().***進行呼叫。

class prentclass(object):

ca = "ca(父類)"

def __init__(self):

print("__init__()被呼叫了(父類)")

def im(self):

print("im()被呼叫了(父類)")

@classmethod

def cm(cls):

print("cm()被調離了(父類)")

class childclass(object):

ca = "ca(子類)"

def __init__(self):

super().__init__()

print("__init__()被呼叫了(子類)")

def im(self):

super().im()

print("im()被呼叫了(子類)")

@classmethod

def cm(cls):

super().cm()

print("cm()被調離了(子類)")

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及其應用》筆記

物件導向程式設計03(封裝 繼承 多型 重寫 MRO)

根據需求將屬性和方法封裝到乙個抽象的類中 在使用的時候,只要按照自己的需求去呼叫,不必了解實現的細節 封裝 封裝是物件導向程式設計的三大特徵之一。封裝有兩方面的含義 1.將資料 屬性 和行為 方法 包裝到類物件中。在方法內部對屬性進行操作,在類物件的外部呼叫方法。這樣,無需關心方法內部的具體實現細節...

物件導向3(封裝)

概念 隱藏物件的內部資訊,給外部提供一些訪問內部的介面。作用 提高 復用性,提高 安全性,提高 易用性。實現步驟 隱藏內部資訊,使用private關鍵字修飾屬性。private 是關鍵字,表示私有的只能修飾屬性和方法,修飾成員只能被類訪問。提供的訪問介面 方法 getter setter方法 返回值...

C語言物件導向程式設計(一) 封裝與繼承

最近在用 c 做專案,之前用慣了 c 轉回頭來用c 還真有點不適應。c 語言中自帶物件導向支援,如封裝 繼承 多型等物件導向的基本特徵。c 原本是面向過程的語言,自身沒有內建這些特性,但我們還是可以利用 c 語言本身已有的特性來實現物件導向的一些基本特徵。接下來我們就一一來細說封裝 繼承 多型 純虛...