文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Python变量教程私有变量详解

2024-04-02 19:55

关注

前言

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

到此这篇关于Python 变量教程私有变量详解的文章就介绍到这了,更多相关Python 私有变量内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯