根據需求將屬性和方法封裝到乙個抽象的類中,在使用的時候,只要按照自己的需求去呼叫,不必了解實現的細節。
封裝有兩方面的含義:
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、如果子類對繼承自父類的某個屬性或方法不滿意,可以在子類中對其進行重寫從而提供自定義的實現,重寫的方式:在子類中定義與父類中同名的屬性和方法(包括裝飾器)。父類中被重寫的名為***的方法,在子類重寫後的方法中可以通過super().***進行呼叫。2、子類重寫父類的屬性或方法後,通過子類或其實例物件只能訪問子類中重寫的屬性或方法,而無法再訪問父類中被重寫的方法。
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 語言本身已有的特性來實現物件導向的一些基本特徵。接下來我們就一一來細說封裝 繼承 多型 純虛...