私有屬性、方法——Python並沒有真正的私有化支持,但可用下划線得到偽私有
盡量避免定義以下划線開頭的變量
(1)_xxx "單下划線 " 開始的成員變量叫做保護變量,意思是只有類對象(即類實例)和子類對象自己能訪問到這些變量,需通過類提供的接口進行訪問;不能用'from module import *'導入
(2)__xxx 類中的私有變量/方法名 (Python的函數也是對象,所以成員方法稱為成員變量也行得通。)," 雙下划線 " 開始的是私有成員,意思是只有類對象自己能訪問,連子類對象也不能訪問到這個數據。
(3)__xxx__ 系統定義名字,前后均有一個“雙下划線” 代表python里特殊方法專用的標識,如 __init__() 代表類的構造函數。
In [6]: class Dog(): ...: def __sit_down(self): ...: print('坐下了') ...: def sit_down(self,host_name): ...: if host_name=='主人': ...: self.__sit_down() In [7]: w=Dog() In [8]: w.sit_down('主人') 坐下了 In [9]: w.sit_down('主') In [10]: w.__sit_down() --------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-10-16df8360e9bf> in <module>() ----> 1 w.__sit_down() AttributeError: 'Dog' object has no attribute '__sit_down' In [13]: w._Dog__sit_down() 坐下了
python實例可以直接調用Python的公有方法;私有方法和屬性在外部不可以直接用屬性或方法名調用,內部將私有方法和屬性在前面增加了 "_類名"
In [14]: dir(Dog) Out[14]: ['_Dog__sit_down', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'sit_down']
- 私有的屬性,不能通過對象直接訪問,但是可以通過方法訪問
- 私有的方法,不能通過對象直接訪問
- 私有的屬性、方法,不會被子類繼承,也不能被訪問
- 一般情況下,私有的屬性、方法都是不對外公布的,往往用來做內部的事情,起到安全的作用
- 可以通過調用繼承的父類的共有方法,間接的訪問父類的私有方法、屬性