Python 變量教程私有變量詳解
前言
Python 中,不存在只能在對象內(nèi)部訪問的“私有”實例變量。然而,大多數(shù) Python 代碼和編碼器都遵循一個約定,即以下劃線為前綴的名稱,例如 _geek應(yīng)被視為 API 或任何 Python 代碼的非公共部分,無論它是函數(shù)還是方法,或數(shù)據(jù)成員。在經(jīng)歷這個過程時,我們還將嘗試理解各種形式的尾隨下劃線的概念,例如,for _ in range(10), init(self)。
重整及其工作原理
在 Python 中,有一種叫做名稱修飾的東西,這意味著對類私有成員的有效用例的支持有限,基本上是為了避免名稱與子類定義的名稱發(fā)生名稱沖突。__geek 形式的任何標識符(至少兩個前導(dǎo)下劃線或最多一個尾隨下劃線)都將替換為 _classname__geek,其中 classname 是當前類名,前導(dǎo)下劃線被去除。只要它出現(xiàn)在類的定義中,這種修飾就完成了。這有助于讓子類覆蓋方法而不破壞類內(nèi)方法調(diào)用。
讓我們看一下這個例子,并嘗試找出這個下劃線是如何工作的:
# 說明重整工作原理的 Python 代碼 class Map: def __init__(self, iterate): self.list = [] self.__geek(iterate) def geek(self, iterate): for item in iterate: self.list.append(item) # 原始 geek() 方法的私有副本 __geek = geek class MapSubclass(Map): # 為 geek() 提供了新的簽名,但不會破壞 __init__() def geek(self, key, value): for i in zip(keys, value): self.list.append(i)
修改規(guī)則的設(shè)計主要是為了避免事故,但仍然可以訪問或修改被認為是私有的變量。這甚至在特殊情況下很有用,例如在調(diào)試器中。
_單前導(dǎo)下劃線
因此,基本上方法、函數(shù)或數(shù)據(jù)成員開頭的下劃線意味著您不應(yīng)該訪問此方法,因為它不是 API 的一部分。
讓我們看一下這段代碼:
# 說明單下劃線如何工作的 Python 代碼 def _get_errors(self): if self._errors is None: self.full_clean() return self._errors errors = property(_get_errors)
該片段取自 Django 源代碼 (django/forms/forms.py)。這表明錯誤是屬性,也是 API 的一部分,但方法 _get_errors 是“私有的”,因此不應(yīng)訪問它。
__雙前導(dǎo)下劃線
一開始,兩條下劃線引起了很多混亂。這是關(guān)于語法而不是約定。雙下劃線將破壞類的屬性名稱,以避免類之間的屬性名稱沖突。
例如:
# 說明開頭雙下劃線如何工作的 Python 代碼 class Geek: def _single_method(self): pass def __double_method(self): # 用于重整 pass class Pyth(Geek): def __double_method(self): # 用于重整 pass
雙前導(dǎo)和雙尾下劃線
還有另一種雙前導(dǎo)和尾隨下劃線的情況。我們在使用特殊變量或方法(稱為“魔術(shù)方法”)時遵循這一點,例如 len、init。這些方法為名稱提供了特殊的句法特征。例如,file 表示 Python 文件的位置,eq 在執(zhí)行 a == b 表達式時執(zhí)行。
例子:
# 說明雙前導(dǎo)和雙尾下劃線工作的 Python 代碼 class Geek: # '__init__' 用于初始化,這是一個特殊的方法 def __init__(self, ab): self.ab = ab # 自定義特殊方法。 盡量不要使用它 def __custom__(self): pass
到此這篇關(guān)于Python 變量教程私有變量詳解的文章就介紹到這了,更多相關(guān)Python 私有變量內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python3實現(xiàn)TCP協(xié)議的簡單服務(wù)器和客戶端案例(分享)
下面小編就為大家?guī)硪黄猵ython3實現(xiàn)TCP協(xié)議的簡單服務(wù)器和客戶端案例(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-06-06
Python中pandas的dataframe過濾數(shù)據(jù)方法
這篇文章主要介紹了Python中pandas的dataframe過濾數(shù)據(jù)方法,Pandas是另外一個用于處理高級數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)分析的Python庫,Pandas是基于Numpy構(gòu)建的一種工具,需要的朋友可以參考下2023-07-07
PyTorch基礎(chǔ)之torch.nn.CrossEntropyLoss交叉熵損失
這篇文章主要介紹了PyTorch基礎(chǔ)之torch.nn.CrossEntropyLoss交叉熵損失講解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-02-02
python在Windows下安裝setuptools(easy_install工具)步驟詳解
這篇文章主要介紹了python在Windows下安裝setuptools(easy_install工具)步驟,簡單介紹了setuptools并分析了其安裝步驟與所涉及的相關(guān)軟件,需要的朋友可以參考下2016-07-07
Django高級編程之自定義Field實現(xiàn)多語言
這篇文章主要介紹了Django高級編程之自定義Field實現(xiàn)多語言,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧2019-07-07
python 實現(xiàn)在tkinter中動態(tài)顯示label圖片的方法
今天小編就為大家分享一篇python 實現(xiàn)在tkinter中動態(tài)顯示label圖片的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-06-06

