python中的下划线

本文介绍了Python中单下划线和双下划线的5种表现形式,以及一些使用方法。其中有一些含义仅仅是依照约定,被视作是对程序员的提示,而有一些含义是由Python解释器严格执行的。

  • 单前导下划线:_var
  • 单末尾下划线:var_
  • 双前导下划线:__var
  • 双前导和末尾下划线:__var__
  • 单下划线:_

1.单前导下划线 _var

下划线前缀的含义是告知其他程序员:以单个下划线开头的变量或方法仅供内部使用。
该约定在PEP 8中有定义。这不是Python强制规定的。而是一个约定俗成的含义。 它是对程序员的一个提示,意味着Python社区一致认为它应该是什么意思,但程序的行为不受影响。
例子:

class Test:def __init__(self):self.foo = 11self._bar = 23

实例化此类,并尝试访问在__init__构造函数中定义的foo和_bar属性,会发生什么情况?

>>> t = Test()
>>> t.foo
11
>>> t._bar
23

你会看到_bar中的单个下划线并没有阻止我们“进入”类并访问该变量的值。这是因为Python中的单个下划线前缀仅仅是一个约定。
但是,如果使用通配符从模块中导入所有名称,则Python不会导入带有前导下划线的名称。

>>> from my_module import *
>>> external_func()
23
>>> _internal_func()
NameError: "name '_internal_func' is not defined"

2. 单末尾下划线 var_

有时候,一个变量的最合适的名称已经被一个关键字所占用。 因此,像class或def这样的名称不能用作Python中的变量名称。 在这种情况下,你可以附加一个下划线来解决命名冲突:

>>> def make_object(name, class):
SyntaxError: "invalid syntax">>> def make_object(name, class_):
...    pass

总之,单个末尾下划线(后缀)是一个约定,用来避免与Python关键字产生命名冲突。 PEP 8解释了这个约定。

3. 双前导下划线 __var

①名称改写
双下划线还可用于名称改写,即将属性或方法前面的双下划线和类名组合起来,以防止子类意外覆盖父类的属性或方法。

class Test:def __init__(self):self.foo = 11self._bar = 23self.__baz = 23

让我们用内置的dir()函数来看看这个对象的属性:

>>> t = Test()
>>> dir(t)
['_Test__baz', '__class__', '__delattr__', '__dict__', '__dir__',
'__doc__', '__eq__', '__format__', '__ge__', '__getattribute__',
'__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__',
'__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__',
'__setattr__', '__sizeof__', '__str__', '__subclasshook__',
'__weakref__', '_bar', 'foo']

以上是这个对象属性的列表。 让我们来看看这个列表,并寻找我们的原始变量名称foo,_bar和__baz ,我保证你会注意到一些有趣的变化。

self.foo变量在属性列表中显示为未修改为foo。
self._bar的行为方式相同 - 它以_bar的形式显示在类上。 就像我之前说过的,在这种情况下,前导下划线仅仅是一个约定。 给程序员一个提示而已。
然而,对于self.__baz而言,情况看起来有点不同。 当你在该列表中搜索__baz时,你会看不到有这个名字的变量。

__baz出什么情况了?

如果你仔细观察,你会看到此对象上有一个名为_Test__baz的属性。 这就是Python解释器所做的名称修饰。 它这样做是为了防止变量在子类中被重写。

②名称修饰
双下划线用于名称修饰,即将属性或方法前面的双下划线作为前缀,使其成为私有成员。私有成员只能在类内部访问,无法在类外部直接访问

class ManglingTest:def __init__(self):self.__mangled = 'hello'def get_mangled(self):return self.__mangled>>> ManglingTest().get_mangled()
'hello'
>>> ManglingTest().__mangled
AttributeError: "'ManglingTest' object has no attribute '__mangled'"

4. 双前导和双末尾下划线__var__

以双下划线开头结尾的变量不会被python解释器修改。
以双下划线开头结尾的方法在python中称为魔法方法。这样的例子有,__init__对象构造函数,或__call__ ,它使得一个对象可以被调用。
为了避免与将来Python语言的变化产生冲突,我应该避免使用双下划线开头和结尾的名称。

5.单下划线 _

按照习惯,有时候单个独立下划线是用作一个名字,来表示某个变量是临时的或无关紧要的。

例如,在下面的循环中,我们不需要访问正在运行的索引,我们可以使用“_”来表示它只是一个临时值:

>>> for _ in range(32):
...    print('Hello, World.')

你也可以在拆分(unpacking)表达式中将单个下划线用作“不关心的”变量,以忽略特定的值。 同样,这个含义只是“依照约定”,并不会在Python解释器中触发特殊的行为。 单个下划线仅仅是一个有效的变量名称,会有这个用途而已。

>>> car = ('red', 'auto', 12, 3812.4)
>>> color, _, _, mileage = car>>> color
'red'
>>> mileage
3812.4
>>> _
12

6.总结

模式格式含义
单前导下划线_var命名约定,仅供内部使用
单末尾下划线var_命名约定,避免与其他关键字命名冲突
双前导双末尾下划线__var触发“名称修饰”,仅能在内部调用
双前导双末尾下划线__var__魔法方法
单下划线_用作临时或者无意义的变量名称

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

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

相关文章

PHP介绍及安装

一、PHP语言介绍 1. PHP是一种用于创建动态交互性网站的服务器端脚本语言。PHP文件通常包含HTML标签和一些PHP脚本代码,这些PHP代码可以放置在文档的任意位置。 2. PHP文件是什么 PHP文件是一种包含有效的HTML、JavaScript代码和PHP代码的文件。PHP代码在服务器上执行,并将…

《网络弹性法案》协议达成,欧盟立法进一步临近实施

欧盟的《网络弹性法案》规定了所有硬件和软件的强制性网络安全要求 《网络弹性法案》(CRA)是欧洲议会和欧洲理事会就即将实施的重要立法达成的政治协议。该法案于 2022 年 9 月由欧洲委员会首次提出,旨在提高数字产品的网络安全,造…

离高薪测试你可能只差这个理解:python 内存管理机制

近期有小伙伴跟我反馈 ,面试有遇到面试官问 python 内存管理机制相关的问题,因为之前没有特地的去了解过,所以不知道怎么回答。 所以今天就专门写了这篇 python 内存管理机制的文章,来给大家系统的梳理一下内存管理机制的知识点&…

访问控制技术

访问控制是在身份认证的基础上,根据不同身份的用户对用户的访问请求加以限制。身份认证关心的是“你是谁,你是否拥有你所声明的身份”这个问题;而访问控制则关心“你能做什么,不能做什么”的问题。 在访问控制过程中,一…

1.查看表的基本结构,表的详细结构和修改表名

查看表的基本结构,表的详细结构和修改表名 1.查看数据表基本结构 有强迫症或健忘症的小伙伴们在建好数据库和表以后,通常会怀疑自己刚才是不是敲错了,怎么办?如果不是使用图形界面是不是就没法查看啦? 不存在的,这就…

大创项目推荐 医学大数据分析 - 心血管疾病分析

文章目录 1 前言1 课题背景2 数据处理3 数据可视化4 最后 1 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 基于大数据的心血管疾病分析 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! &#x1f9…

给Flask加上百度翻译功能,这样可以用中文进行搜索了

上一篇博客:Flask之手搓bootstrap翻页-CSDN博客 里,对 OMDb API - The Open Movie Database 的搜索,只能使用英文,才能搜索出电影信息,如果使用中文,是搜索不到结果的。这里就需要使用翻译,把中…

剪映最新版的4.9,主要更新的功能(于2023年12月2日发布)

新增“多轨道音频”功能:用户可以将多个音频轨道叠加在一起,并对每个音频轨道进行单独的编辑。这使得用户可以更灵活地控制视频的音频效果。新增“音频调音”功能:用户可以使用音频调音功能对视频的音频进行调节,包括音量、音调、…

QString::arg()函数用法(数字前补零)

QString中的arg方法类似于 (1)“C中的printf中使用的格式输出符”和 (2)“C中string的append方法”的结合体。 常用的两种格式如下: 1. 用于填充字符串中的%1,%2…为给定的参数。 //原型: QString QString::arg(const QString & a1) &#xff08…

多功能智能遥测终端机 5G/4G+北斗多信道 视频采集传输

计讯物联多功能智能遥测终端机,全网通5G/4G无线通信、弱信号地区北斗通信,多信道自动切换保障通信联通,丰富网络接口及行业应用接口,支持水利、环保、工业传感器、控制终端、智能终端接入,模拟量/数字量/信号量采集&am…

camera2对摄像头编码h264

MediaCodec编码摄像头数据 前置:保存的一些成员变量 // 摄像头开启的 handler private Handler cameraHandler; // Camera session 会话 handler private Handler sessionHandler; //这里是个Context都行 private AppCompatActivity mActivity; // 这个摄像头所有需…

深入理解 Python 中的 eval 函数

更多资料获取 📚 个人网站:ipengtao.com eval 是 Python 中一个强大而灵活的函数,它允许将字符串作为代码执行。然而,由于其潜在的安全风险,使用时需要谨慎。本文将深入探讨 eval 函数的各个方面,包括基本…

delphi/python 实现小红书xhs用户作品列表和图片/视频无水印解析

技术学习,请勿用与非法用途!!! 成品图用户作品列表接口 /api/sns/web/v1/user_posted?num30&cursor&user_id642bf0850000000011022c4e&image_scenes http Get方式,请求头需要带上x-s x-t签名验证笔记明细…

直流负载箱的技术发展趋势和创新有哪些?

直流负载箱广泛应用于电子、通信、航空航天等领域,随着科技的不断发展,直流负载箱也在不断创新和改进,直流负载箱在负载电流和电压的测量方面要求高精度和高稳定性。未来的发展趋势是提高负载箱的测量精度和稳定性,以满足更高要求…

记录一些好的文章

高效编写可维护代码: 如何高效编写可维护代码? | 菜鸟教程 (runoob.com)

计算平均分并输出低于平均分的学生成绩

从键盘上输入若干&#xff08;<20&#xff09;个学生的成绩&#xff0c;统计计算出平均成绩&#xff0c;并输出低于平均分的学生成绩&#xff0c;用输入负数结束输入。 输入格式: 在一行中输入若干&#xff08;<20&#xff09;个学生的实型成绩&#xff0c;用输入负数结…

uniapp 使用 $emit和$on——$on中无法为data中的变量赋值

问题在于this的指向&#xff0c; 解决办法是使用变量保存$on&#xff0c;其次再为data中的值赋值 以下是具体代码&#xff1a; 1、html代码&#xff1a; <view class"form_picker" click"selePositionFun()"><view class""><inp…

Git

第1章 Git 概述 Git 是一个免费的、开源的分布式版本控制系统&#xff0c;可以快速高效地处理从小型到大型的各种项目。 Git 易于学习&#xff0c;占地面积小&#xff0c;性能极快。 它具有廉价的本地库&#xff0c;方便的暂存区域和多个工作流分支等特性。其性能优于 Subversi…

系统设计之数据库

为您的项目选择正确的数据库是一项复杂的任务。许多数据库选项都适合不同的用例&#xff0c;很快就会导致决策疲劳。 我们希望这份备忘单提供高级指导&#xff0c;以找到符合您项目需求的正确服务并避免潜在的陷阱。 注意&#xff1a;Google 关于其数据库用例的文档有限。尽管…

软件测试卷王的自述,我难道真的很卷?

前言 前段时间去面试了一个公司&#xff0c;成功拿到了offer&#xff0c;薪资也从12k涨到了18k&#xff0c;对于工作都还没两年的我来说&#xff0c;还是比较满意的&#xff0c;毕竟一些工作3、4年的可能还没我高。 我可能就是大家说的卷王&#xff0c;感觉自己年轻&#xff…