『無為則無心』Python面向對象 — 52、私有成員方法(類中行為的封裝)
- 2022 年 2 月 23 日
- 筆記
- 高級測試必會技能 - Python基礎
Python對於類的成員沒有嚴格的訪問控制限制,這與其他面向對象的編程語言是有所區別的。
關於私有方法其實和私有屬性差不多,有如下要點:
- 1、通常我們約定,兩個下劃線開頭的方法是私有方法。
- 2、類內部可以訪問私有方法。
- 3、類外部不能直接訪問私有方法,也就是不同通過
對象.方法名
直接調用。 - 4、類外部可以通過
_類名__私有方法名
訪問私有方法。
示例:
# 在函數名的前面添加兩個下劃線,此時該函數被稱為私有函數
# 只能在當前類中被直接調用,不同通過對象.方法名調用
# 私有函數
class Student():
def __init__(self, name, age):
# 普通變量
self.name = name
# 私有變量
self.__age = age
def tellMe(self):
print(f"大家好,我是{self.name}。是一個公共方法")
# 在公共函數中調用私有方法,
# 調用格式:self.__私有的函數名稱(參數列表)
self.__tellMeAll()
# 定義一個私有方法
def __tellMeAll(self):
print(f"我{self.__age}歲,但我一般不告訴別人。是一個私有方法")
# 在公共函數中調用私有方法,
# 調用格式:self.__私有的函數名稱(參數列表)
# 創建一個Student對象
stu = Student("美猴王", 18)
# 調用公共方法
"""
輸出結果:
大家好,我是美猴王。是一個公共方法
我18歲,但我一般不告訴別人。是一個私有方法
從結果中可以看到,公共方法可以直接通過對象.方法名直接調用。
私有方法可以再對象中被調用。
"""
stu.tellMe()
# 通過對象.方法名直接調用私有方法
# 報錯
# AttributeError: 'Student' object has no attribute '__tellMeAll'
# stu.__tellMeAll()
# 通過對象.方法名直接調用私有方法
# 沒有報錯
# 輸出:我18歲,但我一般不告訴別人。是一個私有方法
stu._Student__tellMeAll()
類中的成員私有優化原理總結:
- Python默認的成員函數和成員變量都是公開的,而在Python中私有屬性和私有方法是沒有類似Java語言的
public
,private
等關鍵詞來修飾的。 - 在Python中定義私有變量,只需要在變量名或函數名前加上
__
兩個下劃線,那麼這個函數或變量就Python中的私有成員了。 - 這是在Python內部使用一種
name mangling
技術,將__membername
替換成_classname__membername
,所以你在類(對象)外部使用原來的私有成員的名字時,會提示找不到。