大多數 python **都遵循這樣乙個約定:帶有乙個下劃線的名稱 (例如: _spam) 應該被當作是 api 的非公有部分 (無論它是函式、方法或是資料成員)。
為了保證對於類私有成員的有效使用(例如避免名稱與派生類所定義的名稱相衝突),設立了名稱改寫(name mangling)機制。任何形式為 __spam 的識別符號(至少帶有兩個字首下劃線,至多乙個字尾下劃線)的文字將被替換為 _classname__spam,其中 classname 為去除了字首下劃線的當前類名稱。這種改寫不考慮識別符號的句法位置,只要它出現在類定義內部就會進行。
名稱改寫有助於讓子類過載方法而不破壞類內方法呼叫。例如:
def __init__(self, iterable):
self.items_list =
self.__update(iterable)
def update(self, iterable):
for item in iterable:
__update = update # private copy of original update() method
def update(self, keys, values):
# provides new signature for update()
# but does not break __init__()
for item in zip(keys, values):
xx:公有變數
_xx:單下劃線,私有化屬性或方法,類物件和子類可以訪問,from somemodule import *禁止匯入
__xx:雙下劃線,私有化屬性或方法,無法在外部直接訪問(名字改寫不能訪問)
__xx__:雙前後下劃線,系統定義名字(使用者避免使用)
示例1:對於變數的訪問尤其注意最後六行,可以看到名稱改寫對私有變數的影響。class student(object):
def __init__(self):
self.num = 10
self._name = "wang"
self.__grade = 30
stu = student()
print(stu.num) # 10
print(stu._name) # wang
# print(stu.__grade) # error
print(stu._student__grade) # 30
stu.__grade = 40
print(stu.__grade) # 40
print(stu._student__grade) # 30
stu._student__grade = 50
print(stu.__grade) # 40
print(stu._student__grade) # 50
可以看出,不能在外部直接訪問雙下劃線的私有變數,而用改寫後的名字即可訪問,因此可知在 python 中並沒有嚴格意義上的私有變數。在程式設計的時候應該注意這一點。
示例2:從外部匯入對私有變數的影響
_variable 型別的屬性或方法不能通過 from module import * 語句匯入,能夠通過 import module 語句匯入
# test.py
num = 10
_name = "wang"
__grade = 30
def get_num():
print("get_num")
def _get_name():
print("get_name")
def __get_grade():
print("get_grade")
from test import *
print(num) # 10
# print(_name) # error
# print(__grade) # error
get_num() # get_num
# _get_name() # error
# __get_grade() # error
可知,利用 import ... 和 from module import ... 匯入後,對於變數的引用方式也是有區別,具體可以看這篇文章。import test
print(test.num) # 10
print(test._name) # wang
print(test.__grade) # 30
test.get_num() # get_num
test._get_name() # get_name
test.__get_grade() # get_grade
也可以通過裝飾器來呼叫私有變數,詳細的可以看這篇文章。
python類的私有變數和私有方法
usr bin env python coding utf 8 time 2017 11 08 8 46 author lijunjiang file class3.py 類的私有變數和私有方法 在python中可以通過在屬性變數名前加上雙下劃線定義屬性為私有屬性 特殊變數命名 1 xx 以單下劃線...
python私有變數
只有在函式裡 不一定是建構函式 以 開頭的變數才是私有變數,看 class a definit self self.data1 1 self.data2 2 self.data3 3 self.data4 44 def fun1 self print self.data4 self.data5 5 ...
python私有變數
在python中定義私有變數只需要在變數名或函式名前加上 兩個下劃線,那麼這個函式或變數就是私有的了。在內部,python使用一種 name mangling 技術,將 membername替換成 classname membername,也就是說,類的內部定義中,所有以雙下劃線開始的名字都被 翻譯...