Python中的单下划线和双下划线使用场景详解
作者:Mr汪 发布时间:2021-10-28 05:08:48
单下划线
单下划线用作变量
最常见的一种使用场景是作为变量占位符,使用场景明显可以减少代码中多余变量的使用。为了方便理解,_
可以看作被丢弃的变量名称,这样做可以让阅读你代码的人知道,这是个不会被使用的变量,e.g.。
for _, _, filenames in os.walk(targetDir):
print(filenames)
for _ in range(100):
print('PythonPoint')
在交互解释器比如iPython中,_
变量指向交互解释器中最后一次执行语句的返回结果。
单下划线前缀名称(例如_pythonPoint)
这表示这是一个保护成员(属性或者方法),只有类对象和子类对象自己能访问到这些变量,是用来指定私有变量和方法的一种方式(约定而已)。如果使用
from a_module import *
导入时,这部分变量和函数不会被导入。不过值得注意的是,如果使用import a_module
这样导入模块,仍然可以用a_module._pythonPoint
这样的形式访问到这样的对象。另外单下划线开头还有一种一般不会用到的情况,例如使用一个C编写的扩展库有时会用下划线开头命名,然后使用一个去掉下划线的Python模块进行包装。如struct这个模块实际上是C模块
_struct
的一个Python包装。
单下划线后缀名称
通常用于和Python关键词区分开来,比如我们需要一个变量叫做class,但class是Python的关键词,就可以以单下划线结尾写作class_
。
双下划线
双下划线前缀名称
这表示这是一个私有成员(属性或者方法)。它无法直接像公有成员一样随便访问。双下划线开头的命名形式在Python的类成员中使用表示名字改编,即如果Test类里有一成员__x
,那么dir(Test)
时会看到_Test__x
而非__x
。这是为了避免该成员的名称与子类中的名称冲突,方便父类和子类中该成员的区分识别。但要注意这要求该名称末尾最多有一个下划线。e.g.
双下划线前缀及后缀名称
一种约定,Python内部的名字,用来区别其他用户自定义的命名,以防冲突。是一些Python的“魔术”对象,表示这是一个特殊成员。如类成员的__init__
、__del__
、__add__
等,以及全局的__file__
、__name__
等。Python官方推荐永远不要将这样的命名方式应用于自己的变量或函数,而是按照文档说明来使用Python内置的这些特殊成员。
Python中关于私有属性、方法约定问题,官方文档如下
“Private” instance variables that cannot be accessed except from inside an object don't exist in Python. However, there is a convention that is followed by most Python code: a name prefixed with an underscore (e.g. _spam) should be treated as a non-public part of the API (whether it is a function, a method or a data member). It should be considered an implementation detail and subject to change without notice.Since there is a valid use-case for class-private members (namely to avoid name clashes of names with names defined by subclasses), there is limited support for such a mechanism, called name mangling. Any identifier of the form__spam (at least two leading underscores, at most one trailing underscore) is textually replaced with _classname__spam, where classname is the current class name with leading underscore(s) stripped. This mangling is done without regard to the syntactic position of the identifier, as long as it occurs within the definition of a class.
Name mangling is helpful for letting subclasses override methods without breaking intraclass method calls.
来源:https://segmentfault.com/a/1190000020326597
猜你喜欢
- re.findall()在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。语法格式:re.find
- 本文实例讲述了Python快速排序算法。分享给大家供大家参考,具体如下:快速排序的时间复杂度是O(NlogN)算法描述:① 先从序列中取出一
- 1.什么是并发编程并发编程是实现多任务协同处理,改善系统性能的方式。Python中实现并发编程主要依靠进程(Process):进程是计算机中
- 最近经常使用字符串查找功能。 包括 1、全匹配查找字符串 2、模糊查找字符串 CHARINDEX 和 PATINDEX 函数都返回指定模式的
- 说起交叉熵损失函数「Cross Entropy Loss」,脑海中立马浮现出它的公式:我们已经对这个交叉熵函数非常熟悉,大多数情况下都是直接
- 前言老旧或者破损的照片如何修复呢?本文主要分享一个博主使用后非常不错的照片恢复开源项目:Bringing-Old-Photos-Back-t
- isalnum()方法检查判断字符串是否包含字母数字字符。语法以下是isalnum()方法的语法:str.isa1num()参数
- 直接分析,如原矩阵如下(1): (1) 我们要截取的矩阵(取其一三行,和三四列数据构成矩阵)为如下(2): (2)错
- <body oncontextmenu="return false" onselectstart="re
- 一、数据预处理实验数据来自genki4k提取含有完整人脸的图片def init_file(): num = 0&n
- 从PJBlog 2.7开始,验证码的功能就很好很强大了,但是同时也给手工输入带来了不小的麻烦——经常输错。之前我写了一个《自己写的一个PJB
- 突然发现, pycharm 2020.2都出来了哈, 现在jetbrain团队对中文用户也比较友好, 比以前更加适合小白了再就是很多类似的教
- 1.什么是内存逃逸在一段程序中,每一个函数都会有自己的内存区域分配自己的局部变量,返回值,这些内存会由编译器在栈中进行分配,每一个函数会分配
- 一、安装selenium打开命令控制符输入:pip install -U selenium火狐浏览器安装firebug:www.firebu
- 用户部分是一个网站的基本功能,django对这部分进行了很好的封装,我们只需要在django的基础上做些简单的修改就可以达到我们想要的效果首
- 1、实例方法/对象方法实例方法或者叫对象方法,指的是我们在类中定义的普通方法。只有实例化对象之后才可以使用的方法,该方法的第一个形参接收的一
- 阻塞定义当来自应用程序的第一个连接控制锁而第二个连接需要相冲突的锁类型时,将发生阻塞。其结果是强制第二个连接等待,而在第一个连接上阻塞。不管
- 看代码吧~class ConvNet(nn.module): def __init__(self, num_cla
- type PipeWritertype PipeWriter struct { // contains
- 生活中经常会碰到多个excel表格汇总成一个表格的情况,比如你发放了一份表格让班级所有同学填写,而你负责将大家的结果合并成一个。诸如此类的问