12.23 面向對象的三大特性:封裝,繼承,多態

封裝

封裝就是使用特殊的語法,對成員屬性和成員方法進行包裝,達到保護和隱藏的目的 但是一定注意,不能把成員全部封裝死,就失去意義了 被封裝的成員主要是供類的內部使用 被特殊語法封裝的成員,會有不同的訪問的權限

封裝的級別

<code>封裝的級別
成員 ==> 公有的
_成員 ==> 受保護的 (約定俗成,而python沒有具體實現)
__成員 ==> 私有的
公有的 public 受保護的 protected 私有的 private
在類的內部 OK OK OK
在類的外部 OK No(python可以) No/<code>

封裝的實現

<code>公有的封裝:
定義:默認定義的成員都屬於公有成員
特徵:公有的成員可以在任何位置進行訪問和操作
受保護封裝
\t\t定義:在成員名稱前面加一個下劃線 _成員名稱
\t\t特徵:受保護的成員和公有成員一樣可以在任何位置進行訪問,但是一般不要隨便訪問和操作受保護成員
私有的封裝
\t\t定義:在成員名稱前面加兩個下劃線 __成員名稱
\t\t特徵:私有的成員只能在當前類的內部去訪問和操作,不能在類的外部進行操作/<code>

查看對象的成員

<code># 查看對象的所以成員
print(ym.__dict__) # 可以獲取當前對象的所有成員信息
# print(Person.__dict__) # 可以獲取當前類的所有成員信息

#{'name': '楊冪', '_age': 28, '_Person__sanwei': '60 55 60'}
/<code>

瞭解:

1.在python中並沒有實現受保護的封裝,屬於開發者的約定俗成。

2.python中的私有化封裝是通過改名策略實現的,並不是真正的私有化


繼承

什麼是繼承?

文化的傳承,技藝的傳承,衣缽的繼承。。。

計算機中的繼承

在面向對象中,一個類去繼承父類,那麼這個類就擁有了父類中的所有成員(除了私有成員)

概念:

被其它類繼承的類,這個類稱為 父類 也叫做 基類 或者 超類

繼承其它類的類,這個類稱為 子類,也叫做 派生類

繼承的意義:

提高代碼的重用性,建立新的類與類的關係,方便其它邏輯的操作

繼承語法格式

<code>class 父類():
\tpass

class 子類(父類):
\tpass/<code>

繼承的特徵

1.在不指定繼承的父類時,所有類都繼承自object類(系統提供) 瞭解

2.子類繼承了父類後,就擁有了父類中的所有成員包括魔術方法(除了私有成員)

3.子類繼承父類後,並不會把父類的成員複製給子類,而去引用

4.子類繼承父類後可以重寫父類中的方法,叫做 重寫

5.子類重寫父類的方法,依然可以使用super().父類方法名()的方式調用父類的方法

6.子類中如果定義了父類中不存在的方法,稱為對父類的擴展

7.一個父類可以被多個子類繼承,還可以存在 鏈式繼承 。鏈式繼承:A類繼承了B類,B類繼承了C類,C類繼承了D類。。。

單繼承和多繼承

單繼承

單繼承:一個類只能繼承一個父類的方式。

語法格式:

<code>class 父類():
\tpass
\t
class 子類(父類):
\tpass/<code>

多繼承

多繼承:一個類去繼承多個父類的方式。

語法格式:

<code>class 父親():
\tpass
\t
class 母親():
pass

class 子類(父親,母親):
\tpass/<code>

菱形繼承(鑽石繼承)

<code>  A
B C
D
# D類去繼承了B類和C類,然後B類和C類又分別繼承了A類,這種繼承關係稱為 菱形繼承/<code>

問題:在這種菱形繼承關係中,類與類的關係,及super()調用時的順序

<code>'''
在定義類後,程序會自動生成一個繼承的列表 MRO (Method Realtion Order) 方法關係列表
MRO列表生成原則:
\t1. 子類永遠在父類的前面
\t2. 同一等級的類,按照子類中的繼承順序擺放
\t3. 先子類,後父類的順序原則,最終的類時系統提供的object類
MRO的調用方法
類名.mro()
'''
C.mro()
# [<class>, <class>, <class>, <class>, <class>]

# super()在調用時,並不是查找父類,而是去MRO列表上找上一個類。
# super()方法在調用時,會自動把當前self傳入到上一級的類的方法中
/<class>/<class>/<class>/<class>/<class>/<code>

類關係檢測 issubclass()

issubclass() 檢測一個類是否時另一個類的子類

<code># 檢測一個類是否是另一個類的子類
res = issubclass(D,B) # True 檢測D類是不是B類的子類
res = issubclass(D,C) # True 檢測D類是不是C類的子類
res = issubclass(D,A) # True 檢測D類是不是A類的子類
res = issubclass(A,D) # False 檢測A類是不是D類的子類/<code>

多態

對於同一個方法,由於調用的對象不同,產生了不同形態的結果

示例:

<code>#  多態 普通版本
# 對於同一個方法,由於調用的對象不同(或者傳入的對象不同),最終實現了不同的結果

# 定義電腦類
class Computer():
# 在電腦類中定義一個 sub 的規範的接口 方法
def usb(self,obj):
obj.start()

# 定義鼠標類
class Mouse():
def start(self):
print('鼠標啟動成功,可以雙擊單擊嗨起來。。。')

# 定義鍵盤類
class KeyBord():
def start(self):
print('鍵盤啟動成功了,趕緊雙擊666。。。')

# 定義 U盤 類
class Udisk():
def start(self):
print('U盤啟動了,趕緊檢查一下我的種子還在不在。。。')

# 實例化對象
c = Computer() # 電腦對象
m = Mouse() # 鼠標對象

k = KeyBord() # 鍵盤對象
u = Udisk() # u盤對象


# 把不同的設備插入到電腦的usb的接口中
c.usb(m)
c.usb(k)
c.usb(u)/<code>


分享到:


相關文章: