Python 教程之变量(9)—— Python 中的私有变量

简介: Python 教程之变量(9)—— Python 中的私有变量

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

感谢大家的阅读,有什么问题的话可以在评论中告诉我。希望大家能够给我来个点赞+收藏+评论 ,你的支持是海海更新的动力!后面我会持续分享前端 & 后端相关的专业知识。


目录
相关文章
|
30天前
|
Python
[oeasy]python050_如何删除变量_del_delete_variable
本文介绍了Python中如何删除变量,通过`del`关键字实现。首先回顾了变量的声明与赋值,说明变量在声明前是不存在的,通过声明赋予其生命和初始值。使用`locals()`函数可查看当前作用域内的所有本地变量。进一步探讨了变量的生命周期,包括自然死亡(程序结束时自动释放)和手动删除(使用`del`关键字)。最后指出,删除后的变量将无法在当前作用域中被访问,并提供了相关示例代码及图像辅助理解。
113 68
|
24天前
|
数据可视化 DataX Python
Seaborn 教程-绘图函数
Seaborn 教程-绘图函数
48 8
|
24天前
Seaborn 教程-主题(Theme)
Seaborn 教程-主题(Theme)
75 7
|
24天前
|
Python
Seaborn 教程-模板(Context)
Seaborn 教程-模板(Context)
48 4
|
24天前
|
数据可视化 Python
Seaborn 教程
Seaborn 教程
46 5
|
1月前
|
Shell Python
[oeasy]python049_[词根溯源]locals_现在都定义了哪些变量
本文介绍了Python中`locals()`函数的使用方法及其在调试中的作用。通过回顾变量赋值、连等赋值、解包赋值等内容,文章详细解释了如何利用`locals()`函数查看当前作用域内的本地变量,并探讨了变量声明前后以及导入模块对本地变量的影响。最后,文章还涉及了一些与“local”相关的英语词汇,如`locate`、`allocate`等,帮助读者更好地理解“本地”概念在编程及日常生活中的应用。
35 9
|
2月前
|
Python
Python三引号用法与变量详解
本文详细介绍了Python中三引号(`"""` 或 `'''`)的用法,包括其基本功能、如何在多行字符串中使用变量(如f-string、str.format()和%操作符),以及实际应用示例,帮助读者更好地理解和运用这一强大工具。
80 2
|
2月前
|
Python
SciPy 教程 之 Scipy 显著性检验 9
SciPy 教程之 Scipy 显著性检验第9部分,介绍了显著性检验的基本概念、作用及原理,通过样本信息判断假设是否成立。着重讲解了使用scipy.stats模块进行显著性检验的方法,包括正态性检验中的偏度和峰度计算,以及如何利用normaltest()函数评估数据是否符合正态分布。示例代码展示了如何计算一组随机数的偏度和峰度。
34 1
|
2月前
|
BI Python
SciPy 教程 之 Scipy 显著性检验 8
本教程介绍SciPy中显著性检验的应用,包括如何利用scipy.stats模块进行显著性检验,以判断样本与总体假设间的差异是否显著。通过示例代码展示了如何使用describe()函数获取数组的统计描述信息,如观测次数、最小最大值、均值、方差等。
34 1
|
2月前
|
数据采集 数据可视化 数据挖掘
深入浅出:使用Python进行数据分析的基础教程
【10月更文挑战第41天】本文旨在为初学者提供一个关于如何使用Python语言进行数据分析的入门指南。我们将通过实际案例,了解数据处理的基本步骤,包括数据的导入、清洗、处理、分析和可视化。文章将用浅显易懂的语言,带领读者一步步掌握数据分析师的基本功,并在文末附上完整的代码示例供参考和实践。