物件導向的三大特性 封裝,繼承,多型

2022-08-26 04:03:08 字數 3293 閱讀 3234

封裝

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

封裝的級別

封裝的級別

成員 ==> 公有的

_成員 ==> 受保護的 (約定俗成,而python沒有具體實現)

__成員 ==> 私有的

公有的 public 受保護的 protected 私有的 private

在類的內部 ok ok ok

在類的外部 ok no(python可以) no

封裝的實現

公有的封裝:

定義:預設定義的成員都屬於公有成員

特徵:公有的成員可以在任何位置進行訪問和操作

受保護封裝

定義:在成員名稱前面加乙個下劃線 _成員名稱

特徵:受保護的成員和公有成員一樣可以在任何位置進行訪問,但是一般不要隨便訪問和操作受保護成員

私有的封裝

定義:在成員名稱前面加兩個下劃線 __成員名稱

特徵:私有的成員只能在當前類的內部去訪問和操作,不能在類的外部進行操作

檢視物件的成員

# 檢視物件的所以成員

print(ym.__dict__) # 可以獲取當前物件的所有成員資訊

# print(person.__dict__) # 可以獲取當前類的所有成員資訊

#

了解:

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

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

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

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

class 父類():

pass

class 子類(父類):

pass

繼承的特徵

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

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

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

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

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

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

7.乙個父類可以被多個子類繼承,還可以存在 鏈式繼承 。鏈式繼承:a類繼承了b類,b類繼承了c類,c類繼承了d類。。。

單繼承和多繼承

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

語法格式:

class 父類():

pass

class 子類(父類):

pass

多繼承

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

語法格式:

class 父親():

pass

class 母親():

pass

class 子類(父親,母親):

pass

菱形繼承(鑽石繼承)

a

b c

d# d類去繼承了b類和c類,然後b類和c類又分別繼承了a類,這種繼承關係稱為 菱形繼承

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

'''

在定義類後,程式會自動生成乙個繼承的列表 mro (method realtion order) 方法關係列表

mro列表生成原則:

1. 子類永遠在父類的前面

2. 同一等級的類,按照子類中的繼承順序擺放

3. 先子類,後父類的順序原則,最終的類時系統提供的object類

mro的呼叫方法

類名.mro()

'''c.mro()

# [, , , , ]

# super()在呼叫時,並不是查詢父類,而是去mro列表上找上乙個類。

# super()方法在呼叫時,會自動把當前self傳入到上一級的類的方法中

類關係檢測 issubclass()

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

# 檢測乙個類是否是另乙個類的子類

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類的子類

多型

對於同乙個方法,由於呼叫的物件不同,產生了不同形態的結果

示例:

#  多型 普通版本

# 對於同乙個方法,由於呼叫的物件不同(或者傳入的物件不同),最終實現了不同的結果

# 定義電腦類

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)

物件導向三大特性 封裝 繼承 多型

封裝 封裝 是將類的某些資訊隱藏在類的內部,不允許外部程式直接訪問,而是通過該類提供的方法來實現對隱藏資訊的操作和訪問。存在乙個邊界,邊界之內的細節隱藏起來,只留下對外的藉口 如 筆記本,手機,飲水機 封裝的好處 只能通過規定方法訪問資料,安全 易用 簡單 易維護。隱藏類的實現細節 方便加入控制語句...

物件導向 三大特性(封裝 繼承 多型)

一 封裝 目的 保護類,讓類更加安全。做法 讓類裡面的成員變數變為私有 即訪問修飾符 的,做相應的方法或者屬性去間接的操作成員變數 訪問修飾符 private 私有的只能在該類中訪問 protected 受保護的只能在該類和它的子類中訪問 public 公有的在任何地方都可以訪問 封裝成員方法來間接...

物件導向三大特性 繼承 封裝 多型

繼承 即子類可以繼承父類的除了所有屬性 方法外的所有內容。子類繼承父類,只需要在類名後面加上 父類名 即可。如下 定義乙個父類,animals class animals pass 再定義乙個子類cat,繼承父類animals class cat animals pass 這樣cat類即可繼承父類的...