python私有變量和私有方法
1. 下劃線妙用
在 Python 中,下劃線可是非常推薦使用的符號:
變量名推薦使用下劃線分隔的蛇形命名法
魔法方法、構造函數都需要使用雙下劃線
對于暫時用不到的變量值,可以賦值給單下劃線 _
進行占位
根據分類,我把下劃線寫法分成下面五種:
單前導下劃線:_var
單末尾下劃線:var_
雙前導下劃線:__var
雙前導和末尾下劃線:__var__
單下劃線:_
由于篇幅所限,本篇將只介紹跟標題(私有變量與私有方法)有關的用法,也就是訪問控制。
上面五種寫法中,涉及到訪問控制的有:_var
和 __var
2. 單前導下劃線 _var
下劃線前綴的含義是告知其他程序員:以單個下劃線開頭的變量或方法僅供內部使用。
請看下面這個例子
class Demo:
def __init__(self):
self.foo = 11
self._bar = 22
如果你實例化此類,然后分別訪問 self.foo
和 self._bar
會發生什么情況?
>>> demo = Demo()
>>> demo.foo
11
>>> demo._bar
22
結果是:外界都可以直接訪問這兩個屬性。
但實際上,二者是有區別的。PEP 8 有提及,如果一個屬性的有單前導下劃線,則該屬性應該僅供內部訪問。
但這并不是強制性的,不然上面我們也不可能通過 self._bar
訪問到 22,但做為一名 Python 程序員最好遵守這一共識。
3. 雙前導下劃線 __var
雙下劃線前綴會導致Python解釋器重寫屬性名稱,以避免子類中的命名沖突。
這也叫做名稱修飾(name mangling) - 解釋器更改變量的名稱,以便在類被擴展的時候不容易產生沖突。
我知道這聽起來很抽象。因此,我組合了一個小小的代碼示例來予以說明:
class Demo:
def __init__(self):
self.foo = 11
self._bar = 22
self.__baz = 33
將其進行實例化,然后使用 dir()
函數查看這個對象的屬性
>>> demo = Demo()
>>> dir(demo)
['_Demo__baz', '__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__', '_bar', 'foo']
不難發現,foo
和 _bar
都很正常,可以使用 demo.屬性名
進行訪問。
但 __baz
明顯和 foo
、 _bar
不一樣,嘗試訪問后卻報了 AttributeError,屬性不存在。
>>> demo.__baz
Traceback (most recent call last):
File "", line 1, in
AttributeError: 'Demo' object has no attribute '__baz'
如果你仔細觀察,你會看到此對象上有一個名為_Demo__baz
的屬性。這就是Python解釋器所做的名稱修飾。它這樣做是為了防止變量在子類中被重寫。
如果想訪問,那得按照 dir 提示的寫法去訪問,在 __baz
前面加上 _類名
。
>>> demo._Demo__baz
33
總結可得,使用雙下劃線開頭的屬性變量,就是一個私有變量。
這樣的規則在屬性上生效,在方法上也同樣適用。
如果一個實例方法,以雙下劃線開頭,那么這個方法就是一個私有的方法,不能由實例對象或者類直接調用。
必須得通過 實例._類名__方法名
來調用。
4. 總結一下
Python并沒有真正的私有化支持,但可用下劃線得到偽私有。
盡量避免定義以下劃線開頭的變量。
私有變量:以雙下劃線前導的變量,可以使用 實例._類名__變量名
進行訪問
私有方法:以雙下劃線前導的方法,可以使用 實例._類名__方法名()
進行訪問
私有變量和私有方法,雖然有辦法訪問,但是仍然不建議使用上面給出的方法直接訪問,而應該用統一的接口(函數入口)來對私有變量進行查看、變量,對私有方法進行調用。
審核編輯:符乾江
-
函數
+關注
關注
3文章
4327瀏覽量
62574 -
代碼
+關注
關注
30文章
4780瀏覽量
68529 -
python
+關注
關注
56文章
4792瀏覽量
84630
發布評論請先 登錄
相關推薦
評論