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

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


目录
相关文章
|
1月前
|
JSON C语言 C++
【Python 基础教程 26】Python3标准库全面入门教程:一步步带你深入理解与应用
【Python 基础教程 26】Python3标准库全面入门教程:一步步带你深入理解与应用
63 1
|
1月前
|
存储 安全 API
【Python 基础教程 21】Python3 文件操作全面指南:从入门到精通的综合教程
【Python 基础教程 21】Python3 文件操作全面指南:从入门到精通的综合教程
82 0
|
3天前
|
运维 Shell Python
Shell和Python学习教程总结
Shell和Python学习教程总结
|
4天前
|
存储 Python
Python变量类型
Python变量类型
8 0
|
4天前
|
存储 Python
Python的变量与数据类型详解
Python的变量与数据类型详解
11 0
|
9天前
|
索引 Python
Python高维变量选择:SCAD平滑剪切绝对偏差惩罚、Lasso惩罚函数比较
Python高维变量选择:SCAD平滑剪切绝对偏差惩罚、Lasso惩罚函数比较
11 0
|
11天前
05-python之函数-函数的定义/函数的参数/函数返回值/函数说明文档/函数的嵌套使用/函数变量的作用域
05-python之函数-函数的定义/函数的参数/函数返回值/函数说明文档/函数的嵌套使用/函数变量的作用域
|
1月前
|
存储 Python
Python变量与数据类型探秘
本文介绍了Python编程中的核心概念——变量和数据类型。变量是存储数据的标识符,无需预声明类型,类型由赋值自动确定。命名规则要求变量名具有描述性,以字母或下划线开头,区分大小写。Python支持多种数据类型:数值(整数、浮点数、复数)、字符串、列表、元组、字典和集合。理解这些基本概念和类型特性对编写高效Python代码至关重要。
|
1月前
|
存储 算法 数据挖掘
【Python 基础教程 25】全面入门指南:深度解析Python3的命名空间,作用域及变量使用教程
【Python 基础教程 25】全面入门指南:深度解析Python3的命名空间,作用域及变量使用教程
56 0
|
1月前
|
存储 机器学习/深度学习 数据安全/隐私保护
【Python 基础教程 24】全面入门Python面向对象编程:深度探索与实战教程
【Python 基础教程 24】全面入门Python面向对象编程:深度探索与实战教程
79 0