Python 變量教程私有變量詳解
前言
Python 中,不存在只能在對象內(nèi)部訪問的“私有”實(shí)例變量。然而,大多數(shù) Python 代碼和編碼器都遵循一個約定,即以下劃線為前綴的名稱,例如 _geek應(yīng)被視為 API 或任何 Python 代碼的非公共部分,無論它是函數(shù)還是方法,或數(shù)據(jù)成員。在經(jīng)歷這個過程時,我們還將嘗試?yán)斫飧鞣N形式的尾隨下劃線的概念,例如,for _ in range(10), init(self)。
重整及其工作原理
在 Python 中,有一種叫做名稱修飾的東西,這意味著對類私有成員的有效用例的支持有限,基本上是為了避免名稱與子類定義的名稱發(fā)生名稱沖突。__geek 形式的任何標(biāo)識符(至少兩個前導(dǎo)下劃線或最多一個尾隨下劃線)都將替換為 _classname__geek,其中 classname 是當(dāng)前類名,前導(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è)計(jì)主要是為了避免事故,但仍然可以訪問或修改被認(rèn)為是私有的變量。這甚至在特殊情況下很有用,例如在調(diào)試器中。
_單前導(dǎo)下劃線
因此,基本上方法、函數(shù)或數(shù)據(jù)成員開頭的下劃線意味著您不應(yīng)該訪問此方法,因?yàn)樗皇?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ù)方法”)時遵循這一點(diǎn),例如 len、init。這些方法為名稱提供了特殊的句法特征。例如,file 表示 Python 文件的位置,eq 在執(zhí)行 a == b 表達(dá)式時執(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)文章
Python實(shí)現(xiàn)視頻自動打碼的示例代碼
我們在觀看視頻的時候,有時候會出現(xiàn)一些奇怪的馬賽克,影響我們的觀影體驗(yàn),那么這些馬賽克是如何精確的加上去的呢?本文就來為大家詳細(xì)講講2022-04-04Keras多線程機(jī)制與flask多線程沖突的解決方案
這篇文章主要介紹了Keras多線程機(jī)制與flask多線程沖突的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-05-05Python實(shí)現(xiàn)網(wǎng)絡(luò)自動化eNSP
這篇文章主要介紹了Python實(shí)現(xiàn)網(wǎng)絡(luò)自動化eNSP,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05python 動態(tài)遷移solr數(shù)據(jù)過程解析
這篇文章主要介紹了python 動態(tài)遷移solr數(shù)據(jù)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-09-09Python產(chǎn)生batch數(shù)據(jù)的操作
這篇文章主要介紹了Python產(chǎn)生batch數(shù)據(jù)的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03Python @property原理解析和用法實(shí)例
這篇文章主要介紹了Python @property原理解析和用法實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-02-02Python 70行代碼實(shí)現(xiàn)簡單算式計(jì)算器解析
這篇文章主要介紹了Python 70行代碼實(shí)現(xiàn)簡單算式計(jì)算器解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-08-08