『無為則無心』Python面向對象 — 52、私有成員方法(類中行為的封裝)

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語言的publicprivate等關鍵詞來修飾的。
  • 在Python中定義私有變量,只需要在變量名或函數名前加上 __兩個下劃線,那麼這個函數或變量就Python中的私有成員了。
  • 這是在Python內部使用一種 name mangling 技術,將 __membername替換成 _classname__membername,所以你在類(對象)外部使用原來的私有成員的名字時,會提示找不到。