前言
在Python的類里面,所有屬性和方法默認都是公共的;但Python也可以設置受保護、私有類型的變量or方法
受保護類型的變量、方法
一般稱為:protected變量
#!/usr/bin/env python # -*- coding: utf-8 -*- class protected: _protected = "受保護變量" name = "test" def test(self): print("實例屬性:", self._protected) print("類屬性:", protected._protected) @classmethod def class_m(cls): print("類方法中類屬性:", cls._protected) def _test(self): print("受保護的方法") class protectedson(protected): def __init__(self): self._protected = "子類的受保護實例變量" print("子類實例屬性:", self._protected) print("子類類屬性:", protectedson._protected) if __name__ == "__main__": p1 = protectedson() p1.test() print("子類實例對象調用類屬性", p1._protected) protectedson.class_m() print("類對象調用類屬性", protectedson._protected) p1._test()
執行結果
子類實例屬性: 子類的受保護實例變量
子類類屬性: 受保護變量
實例屬性: 子類的受保護實例變量
類屬性: 受保護變量
子類實例對象調用類屬性 子類的受保護實例變量
類方法中類屬性: 受保護變量
類對象調用類屬性 受保護變量
受保護的方法
知識點
- 在變量和方法前加一個下划線 _ 即可變成protected類型的變量or方法
- 父類的protected變量,子類能繼承
- 實例對象能直接調用protected變量( 實例對象._protect ),類對象也能直接調用protected變量( 類對象._protect )
總的來說,和公共變量沒有什么特別大的區別
私有類型的變量、方法
#!/usr/bin/env python # -*- coding: utf-8 -*- class privates: __private = "私有變量" def test(self): print("實例對象 - 類內部調用私有變量:", self.__private) print("類對象 - 類內部調用私有變量:", privates.__private) @classmethod def class_m(cls): print("類方法 - 類對象 - 類內部調用私有變量:", cls.__private) def __test(self): print("私有方法") if __name__ == "__main__": p1 = privates() p1.test() print("實例對象 - 外部調用私有變量", p1._privates__private) privates.class_m() print("類對象 - 外部調用私有變量", privates._privates__private) p1._privates__test()
執行方法
實例對象 - 類內部調用私有變量: 私有變量 類對象 - 類內部調用私有變量: 私有變量 實例對象 - 外部調用私有變量 私有變量 類方法 - 類對象 - 類內部調用私有變量: 私有變量 類對象 - 外部調用私有變量 私有變量 私有方法
知識點
- 在變量和方法前加兩個下划線 __ 即可變成private類型的變量or方法
- 子類無法訪問父類的私有變量、方法
- 私有變量只有本類的內部能直接調用
- But!外部真的不能訪問嗎?其實是可以訪問的,python解釋器對外會把 __私有變量 變成 _類名__私有變量 ,無論是實例對象還是類對象,都能通過 ._類名__私有變量 來調用私有變量,算是一種間接調用
總結
無論是受保護型變量還是私有變量,其實在外部還是能訪問的,所以並不能真正控制屬性的訪問權限;
帶着疑問
那我們如何才能控制屬性的訪問權限呢?Python給出的答案是裝飾器 @property,這將在后面的篇幅中介紹