Python 中私有變數的定義和用法

2021-09-28 14:06:42 字數 2837 閱讀 5824

大多數 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 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

可知,利用 import ... 和 from module import ... 匯入後,對於變數的引用方式也是有區別,具體可以看這篇文章。

也可以通過裝飾器來呼叫私有變數,詳細的可以看這篇文章。

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,也就是說,類的內部定義中,所有以雙下劃線開始的名字都被 翻譯...