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

2024-09-07 17:44
文章标签 python 使用 规则 下划线

本文主要是介绍Python中的单下划线和双下划线使用规则,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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 多平台发布

这篇关于Python中的单下划线和双下划线使用规则的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1145723

相关文章

使用Java将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格

redis中使用lua脚本的原理与基本使用详解

《redis中使用lua脚本的原理与基本使用详解》在Redis中使用Lua脚本可以实现原子性操作、减少网络开销以及提高执行效率,下面小编就来和大家详细介绍一下在redis中使用lua脚本的原理... 目录Redis 执行 Lua 脚本的原理基本使用方法使用EVAL命令执行 Lua 脚本使用EVALSHA命令

Python中pywin32 常用窗口操作的实现

《Python中pywin32常用窗口操作的实现》本文主要介绍了Python中pywin32常用窗口操作的实现,pywin32主要的作用是供Python开发者快速调用WindowsAPI的一个... 目录获取窗口句柄获取最前端窗口句柄获取指定坐标处的窗口根据窗口的完整标题匹配获取句柄根据窗口的类别匹配获取句

利用Python打造一个Excel记账模板

《利用Python打造一个Excel记账模板》这篇文章主要为大家详细介绍了如何使用Python打造一个超实用的Excel记账模板,可以帮助大家高效管理财务,迈向财富自由之路,感兴趣的小伙伴快跟随小编一... 目录设置预算百分比超支标红预警记账模板功能介绍基础记账预算管理可视化分析摸鱼时间理财法碎片时间利用财

Java 中的 @SneakyThrows 注解使用方法(简化异常处理的利与弊)

《Java中的@SneakyThrows注解使用方法(简化异常处理的利与弊)》为了简化异常处理,Lombok提供了一个强大的注解@SneakyThrows,本文将详细介绍@SneakyThro... 目录1. @SneakyThrows 简介 1.1 什么是 Lombok?2. @SneakyThrows

Python中的Walrus运算符分析示例详解

《Python中的Walrus运算符分析示例详解》Python中的Walrus运算符(:=)是Python3.8引入的一个新特性,允许在表达式中同时赋值和返回值,它的核心作用是减少重复计算,提升代码简... 目录1. 在循环中避免重复计算2. 在条件判断中同时赋值变量3. 在列表推导式或字典推导式中简化逻辑

python处理带有时区的日期和时间数据

《python处理带有时区的日期和时间数据》这篇文章主要为大家详细介绍了如何在Python中使用pytz库处理时区信息,包括获取当前UTC时间,转换为特定时区等,有需要的小伙伴可以参考一下... 目录时区基本信息python datetime使用timezonepandas处理时区数据知识延展时区基本信息

Python位移操作和位运算的实现示例

《Python位移操作和位运算的实现示例》本文主要介绍了Python位移操作和位运算的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 位移操作1.1 左移操作 (<<)1.2 右移操作 (>>)注意事项:2. 位运算2.1

使用Python和Pyecharts创建交互式地图

《使用Python和Pyecharts创建交互式地图》在数据可视化领域,创建交互式地图是一种强大的方式,可以使受众能够以引人入胜且信息丰富的方式探索地理数据,下面我们看看如何使用Python和Pyec... 目录简介Pyecharts 简介创建上海地图代码说明运行结果总结简介在数据可视化领域,创建交互式地

Java Stream流使用案例深入详解

《JavaStream流使用案例深入详解》:本文主要介绍JavaStream流使用案例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录前言1. Lambda1.1 语法1.2 没参数只有一条语句或者多条语句1.3 一个参数只有一条语句或者多