平时写代码经常碰到下划线、双下划线等“奇怪”的写法,今天特意花时间彻底解决这个问题。文章内容主要参考《深入理解Python特性》一书。

文章目录

  • 前置单下划线:_var
  • 后置单下划线:var_
  • 前置双下划线:__var
  • 前后双下划线:__ var__
  • 单下划线:_
  • 总结:

前置单下划线:_var

意义:python社区约定好单下划线表达的是某种意思,本身不会影响程序的行为

  1. PEP8中定义:以单个下划线开头的变量或方法只在内部使用
  2. 这个符号对python解释器没有什么用,它只是个小小的提示:这个变量或方法并不是这个类的公共接口,最好不要使用它——(因为python中没有严格界定“私有”和“公有”变量,因此下划线可以作为提示)
  3. 使用通配符导入模块Python不会导入带有前置但下划线的名称,除非模块中定义了__all__列表覆盖了这个行为,举个例子:
# test_import.py文件内容
def hello():print('Hello, world!')def _world():print('Hello, world!')
>>> from test_import import *
>>> hello()
Hello, world!
>>> _world()
Traceback (most recent call last):File "<stdin>", line 1, in <module>
NameError: name '_world' is not defined

后置单下划线:var_

意义:名称被Python语言中的关键字占用的时候,就可以使用,比如classdef这些,使用class_def_代替


前置双下划线:__var

这个估计经常遇到

意义:告诉python解释器重写属性名称,避免子类中的命名冲突。

  1. 也称为:名称改写(name mangling)
  2. dir()可以查看对象的属性和方法
  3. 注意类似__bar前面双下划线的方法和变量,
class Test:def __init__(self):self.foo = 12self._bar = 24self.__bar = 43
class ExtendedTest(Test):def __init__(self):super(ExtendedTest, self).__init__()self.foo = 'hello'self._bar = 'world'self.__bar = 'down'

当创建ExtendedTest类的实例t时,调用t.__bar会报错AttributeError: 'ExtendedTest' object has no attribute '__bar'
具体来看一下原因:输入dir(t)

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

我们发现t没有__bar属性,而是变成了_ExtendedTest__bar_Test__bar这是因为Python进行了名称重写
继续输入:t._ExtendedTest__bart__Test__bar,出现了down43

>>> t._ExtendedTest__bar
'down'
>>> t._Test__bar
43
  1. 我们无法察觉双下划线名称的改写,也就是我们无法通过t.__bar直接访问__bar的值,只能借的类方法去访问或者是通过t._ExtendedTest__bar。类似举例如下:
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'"
  1. 名称改写也适用于方法名。
class MangledMethod:def __method(self):return 42def call_it(self):return self.__method()>>> MangledMethod().__method()
AttributeError: "'MangledMethod' object has no attribute '__method'"
>>> MangledMethod().call_it()
42
  1. 还有更神奇的用法:由于名称的改写,因此类中test()方法用__mangled就可以访问在MangledGlobal类中访问全局变量_MangledGlobal__mangled,因为Python的名称改写自动扩展了变量名。
_MangledGlobal__mangled = 23class MangledGlobal:def test(self):return __mangled>>> MangledGlobal().test()
23

前后双下划线:__ var__

意义:如果使用前后双下划线,那么则不会发生名字重写,不受python解释器的影响

  1. 双下划线方法称为魔法方法,最好避免在自己程序中使用双下划线开头和结尾的名称,避免于python语言未来版本变更发生冲突。
  2. python里面有很多内置方法,如:__hash____iter____dict____repr__等其他内置函数,都是用前后双下划线

单下划线:_

  1. 表明变量是临时的或者无关紧要
for _ in range(10):print('Hello, world! ')
  1. 表示解释器计算的上一个表达式的结果
>>> 20 + 3
23
>>> _
23
>>> print(_)
23>>> list()
[]
>>> _.append(1)
>>> _.append(2)
>>> _.append(3)
>>> _
[1, 2, 3]

总结:

  1. 前置单下划线_var:命名约定,表明仅在内部使用(在通配符import * 的时候会有小小的区别),一般对python解释器没有特殊的含义
  2. 后置单下划线:var_:命名约定,避免与python关键字命名冲突
  3. 前置双下划线:__var:名称重写,在类环境中使用会触发名称改写,对python解释器有影响
  4. 前后双下划线:__var__:python定义的魔法方法,在自定义属性中逼民啊用这种命名方式
  5. 单下划线:_:表明变量是临时的或者无关紧要。此外还可以表示Python REPL会话中的上一个结果。

结束了…

【Python特性】Python中的下划线和双下划线是什么意思?相关推荐

  1. Python中的下划线、双下划线

    单下划线和双下划线在Python变量名和方法名中都有各自的含义.有些仅仅是作为约定,用于提示开发人员:而另一些则对Python解释器有特殊含义. 总的来说有一下几种情况: 前置单下划线:_var 后置 ...

  2. python中单下划线_foo与双下划线_Python中单下划线和双下划线

    什么是 Python? Python 之父 Guido van Rossum 说:Python是一种高级程序语言,其核心设计哲学是代码可读性和语法,能够让程序员用很少的代码来表达自己的想法. 对于我来 ...

  3. python 里面的单下划线与双下划线的区别

    python 里面的单下划线与双下划线的区别 Python 用下划线作为变量前缀和后缀指定特殊变量. _xxx 不能用'from moduleimport *'导入 __xxx__ 系统定义名字 __ ...

  4. [Python3] Python中单下划线和双下划线的含义

    本文介绍了Python中单下划线和双下划线("dunder")的各种含义和命名约定,名称修饰(name mangling)的工作原理,以及它如何影响你自己的Python类. 单下划 ...

  5. Python中单下划线和双下划线

    结合书籍,我的理解: 前后双下划线的类中的方法:是特殊方法,用于运算符重载,可以截获运算符. 比如__init__(...)可以截获类的实例化类名(): __add__可以截获 +: __str__可 ...

  6. Python笔记 · 私有方法、私有属性 单下划线、双下划线

    首先,不同于其他编程语言,Python中不存在真正意义上的"私有方法/属性",Python中所胃的"私有方法"要么基于约定,要么基于编译期的改写(Name Ma ...

  7. 浅谈python 里面的单下划线与双下划线的区别

    更新时间:2017年12月01日 10:30:13   作者:空气中的臭氧 这篇文章主要介绍了浅谈python 里面的单下划线与双下划线的区别,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起 ...

  8. python双划线_python 单下划线与双下划线的区别

    原标题:python 单下划线与双下划线的区别 python中下环线共有5中 下面开始一一介绍 1.单前导下划线 _xxx: 变量前面使用单下划线,用于指定该名称为"私有".为方便 ...

  9. java双下划线改单下划线_单下划线与双下划线的区别

    内容目录 单下划线与双下划线的区别 ​ Python用下划线作为前缀和后缀指定特殊变量和定义方法,主要有如下四种形式: 单下划线(_) 名称前的单下划线(如:_name) 名称前的双下划线(如:__n ...

最新文章

  1. WMI技术介绍和应用——查询驱动信息
  2. 计算机管理 未分配磁盘,win7系统硬盘(未分配磁盘)如何重新建立扩展分区?
  3. 实现-驼峰和下划线的转换 工具类
  4. python代码需要背吗-Python 的库、方法这么多,写程序的时候能记住吗?
  5. 浅析Java.lang.ProcessBuilder类
  6. 问题总结:判断MS SQLSERVER临时表是否存在 drop table #tempcitys
  7. 性能测试工具系列(一):性能测试工具对比分析
  8. Zabbix 3.0 安装
  9. 《四世同堂》金句摘抄(十八)
  10. 关于计算机航天生物的想像作文,未来的航天器想象作文750字
  11. 基于 frida 实现的逆向工具包 hooker
  12. python中什么是主要数据类型_python中基本数据类型是什么
  13. html中hr的各种样式使用
  14. 使用SQL Server日志传送将SQL数据库移动到其他服务器
  15. day1 Ubuntu 使用
  16. MySQL恢复备份读书笔记
  17. 软件体系结构风格整理
  18. 无线网络何连不到服务器,关于电脑宾馆连接不上无线网络的解决方法
  19. 京东商城API 商品详情接口
  20. 美团外卖小哥竟开发阿里云盘,抢先首发

热门文章

  1. 英雄会第一届在线编程大赛解题思路
  2. 【最新】2021自动化测试面试宝典1000题
  3. java初中级面试题集锦
  4. win7怎么显示后缀名
  5. 安全计算:使用ClamWin为高级用户提供免费病毒防护
  6. 2022长安杯赛后复现
  7. vue进入浏览器大屏
  8. 程序分析-对程序依赖图(PDG)的理解
  9. 《白夜行》:请让孩子健康成长
  10. ddn高性能服务器,DDN是什么,DDN专线的优势详解