Python 中的单下划线和双下划线

哈喽大家好,我是咸鱼

当我们在学习 Python 的时候,可能会经常遇到单下划线 _ 和双下划线 __ 这两种命名方式

单下划线 _ 和双下划线 __ 不仅仅是只是一种简单的命名习惯,它们在 Python 中有着特殊的含义,对于代码的可读性和功能实现有着关键的作用。

那么今天我们来看一看在 Python 中单下划线和双下划线的用法和意义

前导单下划线

前导单下划线(Leading Single Underscore)通常用于命名变量、方法和属性,表示这些命名的元素是【私有】的或者说是【内部使用】的。

这种命名约定并不是严格的语言规则(即非强制性),而是一种约定,告诉开发人员该对象不应该被外部直接访问或修改

_internal_variable = 10

比如说下面的例子中,_internal_var_internal_method都以前导单下划线开头,表示它们是类的内部使用。

public_method是公共方法,可以在类外部访问。

class MyClass:def __init__(self):self._internal_var = 42  # 前导单下划线表示该变量是内部使用的def _internal_method(self):return 'This is an internal method'def public_method(self):# 在公共方法中调用内部方法和变量print(self._internal_method())print(f'The internal variable is: {self._internal_var}')

虽然可以在类外部访问前导单下划线命名的变量和方法,但是按照约定,建议只在类内部使用,而避免在类外部直接访问它们。

单下划线

单下划线通常用作一个占位符,用于表示一个不重要的变量名或迭代中的临时变量,即在解构赋值或循环迭代中不需要使用的变量

例子一中,_ 用作一个占位符变量,表示在tuple_returning_function()返回的元组中的某个值,但是在解构赋值中没有被使用。

def tuple_returning_function():return (1,1), (2,2), (3,3)_ , tuple_I_need, _ = tuple_returning_function()

例子二中,_ 用作循环迭代中的占位符,因为循环体中不需要使用循环变量的值,只是执行了三次打印操作

for _ in range(0,3):print("打印三次")

单尾随下划线

单个后缀下划线(Single trailing underscores)通常用于避免与 Python 关键字产生命名冲突。它被用作标识符的后缀,以示与Python关键字有所区别。

比如说我想使用一个在 Python 中已经是保留关键字的变量名时,比如class、def、type等。为了避免冲突,可以添加后缀下划线

class_ = "Computer Science"
type_ = “字符串”

Dunder 方法

Dunder 方法指的是以双下划线(__)开头和结尾的特殊方法(也称为魔术方法或特殊方法)。

这些方法具有特殊的行为,可以在自定义类中重写以改变类的行为。Dunder方法的名称是Python中预定义的,例如__init____str____repr__等。

下面是一些常见的 Dunder 方法:

  1. __init__(self, ...): 初始化方法,在对象实例化时调用,用于初始化对象的属性。
  2. __str__(self): 将对象转换为字符串表示形式,当使用print()函数或str()函数时调用。
  3. __repr__(self): 返回一个包含对象信息的字符串,通常用于开发和调试,可通过repr()函数调用。
  4. __len__(self): 返回对象的长度,通过len()函数调用。
  5. __getitem__(self, key): 获取对象的元素,用于索引操作,例如obj[key]
  6. __setitem__(self, key, value): 设置对象的元素,用于索引赋值操作,例如obj[key] = value
  7. __delitem__(self, key): 删除对象的元素,用于索引删除操作,例如del obj[key]
  8. __call__(self, ...): 将对象作为函数调用,使得对象实例可调用。

我们在下面的例子中定义了 __add__ dunder 方法,并创建了两个实例

class Point:def __init__(self, x, y):self.x = xself.y = ydef __add__(self, other):return Point(self.x + other.x, self.y + other.y)def __str__(self):return f"({self.x}, {self.y})"
p1 = Point(1, 2)
p2 = Point(3, 4)
p3 = p1 + p2
print(p3)  # Output: (4, 6)

我们定义了一个 Point 类,它有 xy 两个实例变量以及__add__ 方法和__str__ 方法

当我们使用 + 运算符对 Point 的两个实例(p1、p2)求和时,__add__ 会自动调用。它返回一个新 的 Point 对象(p3),其 xy 值是两个原始 Point对象的 xy 值的和

当使用print()函数时调用自定义的__str__ 方法

前导双下划线

前导双下划线作为前缀在对象名前使用时,表示这是一个特殊的命名约定,它在类定义中用于创建私有属性或方法。

当在类中使用双下划线作为前缀时,Python 解释器会自动修改属性名,以避免在子类中发生命名冲突。这个过程被称为名称修饰(name mangling)

比如下面这个例子:

class MyClass:def __init__(self):self.__private_var = 10def get_private_var(self):return self.__private_var# 创建类的实例
obj = MyClass()# 尝试访问私有属性
print(obj.__private_var)  # 会抛出 AttributeError 错误,因为这个属性名称已被修改# 通过调用访问私有属性的方法来获取
print(obj.get_private_var())  # 输出: 10

__private_var属性在类内部被访问,但是在类外部直接访问会导致 AttributeError 错误。

这是因为 Python 对 __private_var 进行了名称修饰,实际名称变成了 obj._MyClass__private_var,这样避免了外部直接访问

但是我们可以通过调用类内部方法 get_private_var() 在类外部访问私有属性。

通过使用前导双下划线,以确保类的某些属性或方法只能从类本身内部访问。这有助于防止意外修改重要的内部数据,并使代码更加可靠和可维护

但如果你知道修饰后的名称,你仍可以在类外部去访问

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

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

相关文章

勒索解密后oracle无法启动故障处理----惜分飞

客户linux平台被勒索病毒加密,其中有oracle数据库.客户联系黑客进行解密【勒索解密oracle失败】,但是数据库无法正常启动,dbv检查数据库文件报错 [oraclehisdb ~]$ dbv filesystem01.dbf DBVERIFY: Release 11.2.0.1.0 - Production on 星期一 11月 27 21:49:17 2023 Copyrig…

如何在服务器上运行python文件

目录 前置准备 详细步骤 一,在服务器安装Anaconda 下载安装包 上传文件到服务器 安装环境 二,创建虚拟环境 创建环境 三,测试执行python文件 执行python文件 查看进程状态 总结 前置准备 如何在个人服务器上运行python文件&#x…

Mysql索引案例分析

这篇文章写个案例,测试一下MySQL索引机制 测试表结构 CREATE TABLE t_qrcode_op (id int(11) NOT NULL AUTO_INCREMENT COMMENT 主键,op_mobile varchar(16) NOT NULL,pr_code char(10) NOT NULL,PRIMARY KEY (id),UNIQUE KEY om_pc (op_mobile,pr_code) USING BTR…

会员管理系统的意义何在?

在当今的商业环境中,会员管理系统已经成为企业运营的重要组成部分。会员管理系统的意义在于不仅能够帮助企业提高效率,提升用户体验,进行数据分析,营销推广,还能够帮助企业增加收入。下面,我们将详细探讨会…

【.NET Core】语言集成查询(LINQ)详解

【.NET Core】语言集成查询(LINQ)详解 文章目录 【.NET Core】语言集成查询(LINQ)详解一、概述二、查询表达式三、LINQ查询操作中的类型关系3.1 不转换数据源的查询3.2 转换数据源的查询3.3 转换数据源返回复杂类型查询3.4 让编译…

微调Fine tune

网络架构 一个神经网络一般可以分为两块 特征抽取将原始像素变成容易线性分割的特征线性分类器来做分类 微调:使用之前已经训练好的特征抽取模块来直接使用到现有模型上,而对于线性分类器由于标号可能发生改变而不能直接使用 训练 是一个目标数据集上…

道可云元宇宙每日资讯|智慧旅游发展大会暨智慧旅游示范展示活动在南京举办

道可云元宇宙每日简报(2023年11月28日)讯,今日元宇宙新鲜事有: 智慧旅游发展大会暨智慧旅游示范展示活动在南京举办 2023年11月23日至25日,由文化和旅游部资源开发司、江苏省文化和旅游厅共同主办的“智慧旅游发展大会…

Linux驱动开发——网络设备驱动(实战篇)

目录 四、 网络设备驱动实例 五、DM9000 网络设备驱动代码分析 六、NAPI 七、习题 书接上回: Linux驱动开发——网络设备驱动(理论篇)-CSDN博客 (没看过上面博客的同学,skb是linux对于网络套接字缓冲区的一个虚拟…

Leetcode 136. 只出现一次的数字

class Solution {//任何数与0异或结果都是原来的数//任何数和自身异或结果都是0//异或满足交换律和结合律//a ^ b ^ a (a ^ a) ^ b 0 ^ b bpublic int singleNumber(int[] nums) {int res nums[0];for(int i 1; i < nums.length; i){res ^ nums[i];}return res;} }

OpenCvSharp从入门到实践-(04)色彩空间

目录 1、GRAY色彩空间 2、从BGR色彩空间转换到GRAY色彩空间 2.1色彩空间转换码 2.2实例 BGR色彩空间转换到GRAY色彩空间 3、HSV色彩空间 4、从BGR色彩空间转换到HSV色彩空间 4.1色彩空间转换码 4.2实例 BGR色彩空间转换到HSV色彩空间 1、GRAY色彩空间 GRAY色彩空间通常…

26、Spring是如何解决Bean的循环依赖?

Spring是如何解决Bean的循环依赖&#xff1f; 采用三级缓存解决的 就是三个Map &#xff1b; 关键&#xff1a; 一定要有一个缓存保存它的早期对象作为死循环的出口 一级缓存&#xff1a;存储完整的Bean二级缓存&#xff1a; 避免多重循环依赖的情况 重复创建动态代理。三级缓…

Spring简单的存储和读取

前言 前面讲了spring的创建&#xff0c;现在说说关于Bean和五大类注解 一、Bean是什么&#xff1f; 在 Java 语⾔中对象也叫做 Bean&#xff0c;所以后⾯咱们再遇到对象就以 Bean 著称。这篇文章还是以spring创建为主。 二、存储对象 2.1 俩种存储方式 需要在 spring-conf…

FlinkSql-Temporal Joins-Lookup Join

说明 在 Flink SQL 中&#xff0c;Temporal Joins 是一种常见的数据关联操作&#xff0c;特别适用于处理包含时间维度的数据。Lookup Join 是 Temporal Joins 的一种类型&#xff0c;它允许将流数据与维表数据进行关联。使用场景如下&#xff1a; 实时维度关联&#xff1a; 当…

Python---文件备份案例

需求&#xff1a;用户输入当前目录下任意文件名&#xff0c;完成对该文件的备份功能(备份文件名为xx[备份]后缀&#xff0c;例如&#xff1a;test[备份].txt)。 思考&#xff1a; ① 接收用户输入的文件名 ② 规划备份文件名 ③ 备份文件写入数据 代码 # 1、接收用户输入的…

paddle detection整体结构

核心思想就是通过Yaml文件将主体模块和可拔插的模块组成一个完整的pipline. train.py流程解析&#xff1a; 初始化训练参数 1 parserArgsParser() #读取命令行传递参数&#xff0c;加载yaml文件参数 2 整合参数&#xff0c;检查参数配置是否正确 3 检查是否使用GPU加速 4 检查…

Ubuntu 18.04 ARM离线安装cifs-utils

1、环境说明 由于本地都是x86&#xff0c;不支持arm架构&#xff0c;所以用Docker容器下载离线包本地环境&#xff1a;Docker、Ubuntu 22.04.1 LTS x86&#xff08;可上网&#xff09;安装环境&#xff1a;Ubuntu 18.04.4 LTS arm&#xff08;内网&#xff09; 2、启动qemu-a…

使用Jmeter进行http接口性能测试

在进行网页或应用程序后台接口开发时&#xff0c;一般要及时测试开发的接口能否正确接收和返回数据&#xff0c;对于单次测试&#xff0c;Postman插件是个不错的Http请求模拟工具。 但是Postman只能模拟单客户端的单次请求&#xff0c;而对于模拟多用户并发等性能测试&#xf…

[Verilog语法]:===和!==运算符使用注意事项

[Verilog语法]&#xff1a;和!运算符使用注意事项 1&#xff0c; 和 !运算符使用注意事项2&#xff0c;3&#xff0c; 1&#xff0c; 和 !运算符使用注意事项 参考文献&#xff1a; 1&#xff0c;[SystemVerilog语法拾遗] 和!运算符使用注意事项 2&#xff0c; 3&#xff0c;

机器学习入门(第五天)——决策树(每次选一边)

Decision tree 知识树 Knowledge tree 一个小故事 A story 挑苹果&#xff1a; 根据这些特征&#xff0c;如颜色是否是红色、硬度是否是硬、香味是否是香&#xff0c;如果全部满足绝对是好苹果&#xff0c;或者红色硬但是无味也是好苹果&#xff0c;从上图可以看出来&#…

数据可视化:用图表和图形展示数据

写在开头 在当今信息爆炸的时代,海量的数据如同一座沉默的宝库,等待着我们挖掘和理解。然而,这些庞大的数据集本身可能令人望而生畏。在这个时候,数据可视化成为了解数据、发现模式和传达信息的强大工具。本篇博客将带领你探索数据可视化的奇妙世界,学习如何在python中使…