日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Python?變量教程私有變量詳解_python

作者:海擁??????? ? 更新時間: 2022-10-19 編程語言

前言

Python 中,不存在只能在對象內部訪問的“私有”實例變量。然而,大多數 Python 代碼和編碼器都遵循一個約定,即以下劃線為前綴的名稱,例如?_geek應被視為 API 或任何 Python 代碼的非公共部分,無論它是函數還是方法,或數據成員。在經歷這個過程時,我們還將嘗試理解各種形式的尾隨下劃線的概念,例如,for _ in range(10),?init(self)。?

重整及其工作原理

在 Python 中,有一種叫做名稱修飾的東西,這意味著對類私有成員的有效用例的支持有限,基本上是為了避免名稱與子類定義的名稱發生名稱沖突。__geek 形式的任何標識符(至少兩個前導下劃線或最多一個尾隨下劃線)都將替換為 _classname__geek,其中 classname 是當前類名,前導下劃線被去除。只要它出現在類的定義中,這種修飾就完成了。這有助于讓子類覆蓋方法而不破壞類內方法調用。?
讓我們看一下這個例子,并嘗試找出這個下劃線是如何工作的:?

# 說明重整工作原理的 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)

修改規則的設計主要是為了避免事故,但仍然可以訪問或修改被認為是私有的變量。這甚至在特殊情況下很有用,例如在調試器中。

_單前導下劃線

因此,基本上方法、函數或數據成員開頭的下劃線意味著您不應該訪問此方法,因為它不是 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 是“私有的”,因此不應訪問它。

__雙前導下劃線

一開始,兩條下劃線引起了很多混亂。這是關于語法而不是約定。雙下劃線將破壞類的屬性名稱,以避免類之間的屬性名稱沖突。

例如:

# 說明開頭雙下劃線如何工作的 Python 代碼
class Geek:
	def _single_method(self):
		pass
	def __double_method(self): # 用于重整
		pass
class Pyth(Geek):
	def __double_method(self): # 用于重整
		pass

雙前導和雙尾下劃線

還有另一種雙前導和尾隨下劃線的情況。我們在使用特殊變量或方法(稱為“魔術方法”)時遵循這一點,例如?leninit。這些方法為名稱提供了特殊的句法特征。例如,file?表示 Python 文件的位置,eq?在執行 a == b 表達式時執行。?

例子:

# 說明雙前導和雙尾下劃線工作的 Python 代碼
class Geek:

	# '__init__' 用于初始化,這是一個特殊的方法
	def __init__(self, ab):
		self.ab = ab

	# 自定義特殊方法。 盡量不要使用它
	def __custom__(self):
		pass

原文鏈接:https://juejin.cn/post/7134316143607005215

欄目分類
最近更新