Python中的单下划线和双下划线使用规则

news2024/12/28 18:16:06
alt

引言

Python 遵循一些关键的命名规则,这些规则涉及到使用单个或双下划线。通过这些规则,你可以在应用程序接口(API)中区分可访问的和不可访问的标识符,编写适用于继承的稳健类,以及防止命名冲突等。

遵守这些规则,你的代码将显得更贴近 Python 的风格,并且在其他 Python 程序员看来更加统一。这项技能在你为其他开发者编写代码时尤为重要。

本文[1]将带你了解:

  • 基于使用下划线 (_) 的 Python 命名规则
  • 通过单个下划线标识符来区分可公开访问和不可公开访问的名称
  • 使用双下划线来利用 Python 类中的名称混淆特性
  • 探索 Python 中下划线的其他常见用途 为了从本教程中获得最大收益,你应该对 Python 的变量、常量、函数、模块有所了解,尤其是对类和面向对象编程有深入理解。

公共接口与命名规则

作为一名 Python 开发者,你经常需要与公共接口,也就是应用程序编程接口(API)打交道。API 是一种提供给程序内部或外部程序使用的服务接口。

比如,Python 的标准库中包含了许多提供服务的模块和包。要使用这些模块和包,你需要访问它们的公共部分,比如类、函数、变量、常量和模块。这些元素构成了模块或包的公共接口,你可以直接在你的代码中使用它们。

但是,许多包和模块定义了一些不打算被直接访问的对象,这些对象仅供它们自己内部使用,不属于公共接口。

在面向对象编程中,C++ 和 Java 等语言区分了公共和私有的方法与属性。在这些语言中,你可以这样使用类成员:

  • 公共:你可以在自己的代码或其他代码中使用它们。
  • 私有:你只能在定义它们的类或其子类中使用它们。

这些语言通过特定的关键字和语法来定义类中的公共和私有成员。一旦成员被声明为私有,它就不能在类外部被访问,因为语言限制了这种访问。因此,私有成员不属于类的公共接口,你无法访问它们。

与此不同,Python 并没有公共和私有成员的概念,也没有专门的关键字或语法来定义它们。因此,你可以访问 Python 类中的所有成员。

如果 Python 没有特定的语法来定义一个对象是否属于公共接口,那么如何告知用户他们是否可以在自己的代码中使用某个类、方法、函数、变量、常量或模块呢?

为了解决这个问题,Python 社区建立了一套公认的命名规则。你应该遵循这些规则,明确告诉其他开发者是否应该在他们的代码中直接使用你的变量、常量、函数、方法和模块。

请注意,这些命名规则并不限制对对象的访问,它们只是对使用你代码的其他开发者的一种提示。因此,Python 不使用“公共”和“私有”这样的术语,而是使用“公共”和“非公共”。

在 Python 中,如果一个名称以大小写字母开头,你应该认为它是公共的,属于代码的 API 部分。而如果一个名称以下划线 (_) 开头,你应该认为它是非公共的,不包含在代码的 API 中。

Python 社区还使用下划线字符 (_) 来遵循其他一些命名规则。PEP 8 对如何在命名中使用这个字符有如下说明:

alt

请注意,这些命名规则中仅有两条会触发 Python 的特定行为。当你在类中使用双下划线前缀时,会触发名称混淆机制。在关于名称混淆的章节中,你将更深入地了解这一行为。

此外,那些在 Python 数据模型中列出的、带有双下划线前后缀的名称,在特定情境下会触发内部行为。在 Python 中关于特殊方法名的章节中,你将更深入地了解这一主题。

注意:Python 特别对待单个下划线,但这种特殊待遇仅出现在 match … case 语句中。稍后你将对这一点有更深的理解。

单个前导下划线

正如你所知,Python 并没有专门的关键字和语法来定义对象的公共或私有属性。因此,Python 将对象定义为公共或非公共,并且不对它们的访问进行限制。

创建 Python 中的公共和非公共名称 公共名称构成了你代码的公共接口或 API。这些名称是用户用来访问你代码中不同功能和特性的。这些名称应该是具有描述性的、易于理解的,并且随着时间推移保持一致性:

>>> public = "This is a public name."
>>> public
'This is a public name.'

这里的“稳定”指的是,一旦某个名称被纳入了你代码的公共接口,它就应该长期保持不变。如果变更了这些名称,可能会导致用户的代码无法正常运行,尤其是在你更新了 API 之后。

在构建代码的公共接口时,你需要慎重选择哪些名称应该公开。并不是所有代码中的对象都需要公开。如果你将不应该由客户端代码使用的某个对象设置为公共名称,那么你就冒着被误用的风险。

相反,非公共名称用于支持代码的内部功能。这些名称属于代码的内部实现细节,而不是 API 的一部分。因此,用户不应该在他们的代码中使用这些非公共名称,因为随着时间的推移,这些名称可能会更改,或者在未来版本的代码中可能不再存在。

以下是一个非公共名称的示例:

>>> _non_public = "This is a non-public name."
>>> _non_public
'This is a non-public name.'

Python 开发者习惯用单个下划线前缀来标示对象为内部使用,而非公开暴露。

通常,只有当你想表明某个变量、类、方法、函数或模块仅供其所在的模块、类或包内部使用时,才使用单个下划线前缀。这只是一种约定俗成的命名习惯,并非 Python 强制的硬性规定。你总是能够访问到这些非公开的名称,除非它们被定义在无法访问的作用域内。

遵守这种命名习惯是编写和阅读 Python 代码时应该考虑的一个良好做法。

一般而言,那些在代码演进过程中可能会被修改的对象应该保持为非公开状态。所以,当你犹豫不决时,就给你的对象起个非公开的名称。如果你之后决定将某个原本非公开的对象纳入代码的 API,那么可以去掉这个下划线前缀。这种做法有助于你稳定 API,并防止破坏用户的代码。

如果你是在使用他人的代码,那么在对象名称中看到单个下划线前缀,就应该意识到这是一个避免在你自己代码中直接使用该对象的信号。

Reference
[1]

Source: https://realpython.com/python-double-underscore/

本文由 mdnice 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2114077.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Sysbench性能测试工具的安装与使用

目录 前言1. Sysbench介绍2. 下载与安装2.1 系统准备2.2 安装Sysbench 3. Sysbench命令参数详解3.1 CPU测试3.2 内存测试3.3 磁盘I/O测试3.4 数据库测试 4. 实例演示:多维度性能测试4.1 CPU性能测试示例4.2 数据库性能测试示例4.3 内存网络性能测试4.4 磁盘I/O网络性…

day-50 求出最长好子序列 I

思路 二维dp,dp[i][h]表示nums[i] 结尾&#xff0c;且有不超过 h 个下标满足条件的最长好子序列的长度&#xff08;0<h<k&#xff09;&#xff0c;二维数组dp初始值全为1 解题过程 状态转换方程&#xff1a; 1.nums[i]nums[j],dp[i,h]Math.max(dp[i,h],dp[j,h]1) 2.num…

深入RabbitMQ世界:探索3种队列、4种交换机、7大工作模式及常见概念

文章目录 文章导图RabbitMQ架构及相关概念四大核心概念名词解读 七大工作模式及四大交换机类型0、前置了解-默认交换机DirectExchange1、简单模式(Simple Queue)-默认DirectExchange2、 工作队列模式(Work Queues)-默认DirectExchange3、发布/订阅模式(Publish/Subscribe)-Fano…

医院检验系统LIS源码,LIS系统的定义、功能结构以及样本管理的操作流程

本文将对医院检验系统LIS进行介绍&#xff0c;包括LIS系统的定义、功能结构以及样本管理的操作流程方面。 LIS系统定义 LIS系统&#xff08;Laboratory Information System&#xff09;是一种专门为临床检验实验室开发的信息管理系统&#xff0c;其主要功能包括实验室信息管理…

攻防世界 supersqli

supersqli 一般sql语句的题都是先判断&#xff0c;经过测试&#xff0c;是单引号注入 999 union select database(),2#可以发现很多关键字都被过滤了select&#xff0c;所以联合查询&#xff0c;报错注入&#xff0c;布尔和时间盲注都不能用了&#xff0c;可以想到堆叠注入。…

【重学 MySQL】十六、算术运算符的使用

【重学 MySQL】十六、算术运算符的使用 加法 ()减法 (-)乘法 (*)除法 (/ 或 div )取模&#xff08;求余数&#xff09; (% 或 mod )注意事项 在 MySQL 中&#xff0c;算术运算符用于执行数学运算&#xff0c;如加法、减法、乘法、除法和取模&#xff08;求余数&#xff09;等。…

数字逻辑设计基础

参考&#xff1a; 正点原子逻辑设计指南 状态机FSM 目录 一、组合逻辑组合逻辑中的竞争-冒险现象组合逻辑毛刺消除 二、时序逻辑锁存器触发器寄存器计数器 三、边沿检测电路四、格雷码转换电路五、复位电路数字逻辑需要复位的原因同步复位异步复位异步复位、同步释放 六、状…

C++---基础概念

1 命名空间 在C/C中&#xff0c;变量、函数和后面要学到的类都是大量存在的&#xff0c;这些变量、函数和类的名称将都存 在于全局作用域中&#xff0c;可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化&#xff0c; 以避免命名冲突或名字污染&#xff0c;n…

Redis - 缓存

文章目录 目录 文章目录 1. 什么是缓存&#xff1f; 2. 使用Redis作为缓存 2.1 关系型数据库的缺点 3. 缓存的更新策略 3.1 定期生成 3.2 实时生成 缓存淘汰策略 4. 缓存预热, 缓存穿透, 缓存雪崩 和 缓存击穿 缓存预热 缓存穿透 缓存雪崩 缓存击穿 总结 1. 什么…

Web安全之XSS跨站脚本攻击:如何预防及解决

1. 什么是XSS注入 XSS&#xff08;跨站脚本攻击&#xff0c;Cross-Site Scripting&#xff09;是一种常见的Web安全漏洞&#xff0c;通过注入恶意代码&#xff08;通常是JavaScript&#xff09;到目标网站的网页中&#xff0c;以此在用户浏览网页时执行。攻击者可以通过XSS获取…

特征值分解(EVD)和奇异值分解(SVD)—应用于图片压缩

特征值分解(EVD)和奇异值分解(SVD)—应用于图片压缩 目录 前言 一、特征值分解 二、应用特征值分解对图片进行压缩 三、矩阵的奇异值分解 四、应用奇异值分解对图片进行压缩 五、MATLAB仿真代码 前言 学习了特征值分解和奇异值分解相关知识&#xff0c;发现其可以用于图片…

初次使用住宅代理有哪些常见误区?

随着网络技术的发展&#xff0c;住宅代理因其高匿名性和稳定性成为许多用户进行网络活动的首选工具。然而&#xff0c;对于新手而言&#xff0c;使用住宅代理时往往容易陷入一些误区&#xff0c;这不仅可能影响使用效果&#xff0c;还可能带来安全风险。本文将探讨新手在使用住…

我与Linux的爱恋:yum和vim以及gcc的使用

​ ​ &#x1f525;个人主页&#xff1a;guoguoqiang. &#x1f525;专栏&#xff1a;Linux的学习 文章目录 ​1.Linux软件包管理器yum2.Linux开发工具3.Linux编译器 vimvim的基本概念vim的基本操作vim正常模式命令集vim末行模式命令集vim操作总结批量化注释批量化去注释简…

【数据库中级】1_DBeaver操作数据库

文章目录 一、连接数据库1.1 命令行连接数据库1.2 DBeaver工具连接数据库 二、DBeaver操作数据库2.1 通过DBeaver操作数据库2.2 通过DBeaver操作表2.3 通过DBeaver操作数据 三、DBeaver界面3.1 SQL编辑区3.2 导航区3.3 修改字体大小 一、连接数据库 1.1 命令行连接数据库 命令…

《Learning to Count without Annotations》CVPR2024

摘要 论文提出了一种名为UnCounTR的模型&#xff0c;该模型能够在没有任何手动标注的情况下学习进行基于参考的对象计数。这是通过构建“Self-Collages”&#xff08;自我拼贴画&#xff09;实现的&#xff0c;即在背景图像上粘贴不同对象的图像作为训练样本&#xff0c;提供覆…

【Git 学习笔记_24】Git 实用冷门操作技巧(四)—— 更多实用 git 别名设置、交互式新增提交

文章目录 11.8 更多别名设置别名1&#xff1a;只查看当前分支&#xff08;git b&#xff09;别名2&#xff1a;以图表形式显示自定义格式的 git 日志&#xff08;git graph&#xff09;别名3&#xff1a;查看由于合并分支导致的冲突后仍有冲突的、待合并的文件列表&#xff08;…

Excel文档的读取(1)

熟悉使用Excel的同学应该都知道&#xff0c;在单个Excel表格里想要分商品计算总销售额&#xff0c;使用数据透视表也可以非常快速方便的获得结果。但当有非常大量的Excel文件需要处理时&#xff0c;每一个Excel文件单独去做数据透视也会消耗大量的时间。就算使用Power Query这样…

python容器3——字典

&#xff08;1&#xff09; 什么是字典 字典&#xff1a;python中使用关键字dict表示 字典中允许通过key:value键值对的方式存储数据&#xff0c;让数据的管理更加友好&#xff01; 如图&#xff1a; 字典是一个哈希结构 (传入一个值算出内存地址&#xff0c;将该值保存在该…

产品经理就业

供需关系 1.需求分析核心价值是? 将真实的用户需求分析得到与之匹配的产品方案(功能) 2.Y模型的主要内容及其侧重点? 1)用户需求、2)目标动机、3)产品功能、4)人性(马斯洛需求) 1-2-4侧重深入想清楚需求本质 Why、4 -2-3 侧重浅出 How 结果输出 3.可以从哪些角度做好需求分析…

java.lang.IndexOutOfBoundsException: setSpan ( 0...x ) ends beyond length X

1&#xff0c;可能是EditText&#xff0c;setSelection(x)时超过了 输入框内容的实际长度导致的。 2&#xff0c;手机开启“拼写检查功能”&#xff0c;EditText设置了最大长度&#xff0c;选择提示的某一项文案时超过设置的最大长度限制&#xff0c;导致崩溃。 针对情况2 开…