1. 概述

在Python经常能见到含下划线(underscore)修饰的的变量和方法(如__name__,_var等),这些下划线的作用称之为名字修饰(name decoration)。在Python中,名字修饰通常有以下几种情况:

  • 单前缀下划线(single leading underscore):_var
  • 单后缀下划线(single trailingunderscore):var_
  • 双前缀下划线(double leading underscores):__var
  • 双前缀+双后缀下划线(double leading & trailing underscores):__var__

除了名字修饰,在Python中下划线还有以下用法:

  • 单独一个下划线
  • 数字分隔符下划线
  • IPython中的特殊用途

我们对以上用法进行逐一详解。

2. 名字修饰(name decoration)

2.1 单前缀下划线

方法和实例变量

Use one leading underscore only for non-public methods and instance variables.[1]

即,单前缀下划线用于私有的方法和实例变量。但Python和Java不同,并没有对公有和私有进行严格的区分。即便一个方法或者变量有单前缀下划线,也不影响被外界调用,它的作用仅限于一种“提示”(weak “internal use” indicator)。

class Test:def __init__(self):self.a = "a"self._b = "b"def _private_method(self):return ("This is a private method!")# 单前缀下划线并不影响从外界调用
t = Test()
print(t.a)
print(t._b)
print(t._private_method)

导入

from M import *does not import objects whose names start with an underscore.[1]

即,当从另一个模块导入内容是,含前缀下划线的内容不会被导入。如

# demo.py
a = "a"
_b = "b"def _private_function():return "This is a private function!"
from demo import *print(a)
print(_b)                   # 会报错,私有变量无法导入
print(_private_function)    # 会报错,私有函数无法导入

2.2 单后缀下划线

single_trailing_underscore_: used by convention to avoid conflicts with Python keyword[1]

单后缀下划线主要是为了避免与一些Python关键字(如class,sum之类的)的冲突,如

tkinter.Toplevel(master, class_='ClassName')

2.3 双前缀下划线

To avoid name clashes with subclasses, use two leading underscores to invoke Python's name mangling rules.
Python mangles these names with the class name: if class Foo has an attribute named __a, it cannot be accessed by Foo.__a. (An insistent user could still gain access by calling Foo._Foo__a.) Generally, double leading underscores should be used only to avoid name conflicts with attributes in classes designed to be subclassed.[1]

双前缀下划线会触发Python中的名字改写规则(name mangling)什么意思呢?举个例子

class Test:__a = "__a"def __init__(self) -> None:self.__b = "__b"self._c = "_c"self.d = "d"t = Test()
print(dir(t))

猜猜会打印什么呢?结果如下

name mangling

你会发现有_c和d,但是没有__a和__b。这是为什么呢?这是因为他们被改写成了_Test__a和_Test_b。因为名字被改写,所以不能通过t.__a访问,但是可以通过t._Test__a进行访问。

print(t.__a)        # 会报错
print(t._Test__a)   # 不会报错

为什么要这样设计呢?这样是为了避免在继承的时候,这些变量被重写,如

class Test:__a = "__a"class SubTest(Test):__a = "change __a"st = SubTest()
print(dir(st))

执行结果如下,如果在子类中重新定义__a时,会重新生成一个_SubTest__a,这样避免了父类中的_Test__a被改写。

除了_Test__a,还有_SubTest__a

2.4 双前缀+双后缀下划线

与双前缀下划线不同,双前缀+双后缀下划线并不会对名字进行改写。这些使用了双前缀+双后缀下划线的对象又被称为dunders,即Double UNDERScores的缩写。

魔法函数

__double_leading_and_trailing_underscore__: “magic” objects or attributes that live in user-controlled namespaces. E.g. __init____import__ or __file__. Never invent such names; only use them as documented.

双前缀+双后缀下划线常用于“魔法函数”,表明这些函数被“官方占用”,不建议自行定义一个双前缀+双后缀下划线的对象,因为有可能与“官方用法”产生冲突。

模块

Module level “dunders” (i.e. names with two leading and two trailing underscores) such as__all__,__author__,__version__, etc. should be placed after the module docstring but before any import statements exceptfrom__future__imports. Python mandates that future-imports must appear in the module before any other code except docstrings:

除了魔法函数,一些模块也使用了双前缀+双后缀下划线,如__future__。Python要求的导入顺序是:__future__的import放在最前,然后是dunders的import,最后是普通的import。其中__future__的import强制放在最前,否则会报错。

"""
This is a demo! 这种docstrings放在最前
"""from __future__ import barry_as_FLUFL__all__ = ["test"]
__version__ = '0.1'
__author__ = 'Mr. Cheng'import pandas as pd

3. 其他用法

3.1 单独一个下划线

当我们需要一个变量,但是又不需要在后面的程序中调用这个变量时,就可以用_,相当于告诉大家:这个变量无关紧要。最典型的例子就是用于for循环,如

for _ in range(10):print("打印10次!")

也可以用作占位符对可迭代对象进行拆分,如

a, _, _, c = (1, 2, 3, 4)
a, _, _, c = [1, 2, 3, 4]

3.2 数字分隔符

在会计中,我们用逗号对较大的数字进行分隔,以方便识别,如93,123,110。但是在Python中,显然不能用逗号,但是可以用下划线,如:

a = 93_123_110

3.3 IPython中的特殊用途

在iPython中,下划线还有一个特殊用途:用以指代最近一个表达式的输出结果。如

在学编程,学Python的小伙伴们,一个人摸黑学会很难,博主也是过来人, 这里新建了一个扣群:1020465983,给大家准备了学习资源、好玩的项目,欢迎大家加入一起交流。

Python中的下划线到底什么意思?相关推荐

  1. python怎么打下划线符号_详解 Python 中的下划线命名规则

    在 python 中,下划线命名规则往往令初学者相当 疑惑:单下划线.双下划线.双下划线还分前后--那它们的作用与使用场景 到底有何区别呢?今天 就来聊聊这个话题. 1.单下划线(_) 通常情况下,单 ...

  2. Python中单个下划线“ _”变量的用途是什么?

    这段代码中_ after for的含义是什么? if tbh.bag:n = 0for _ in tbh.bag.atom_set():n += 1 #1楼 下划线_在Python中被视为" ...

  3. python变量必须以字母和下划线_【转载】关于python中带下划线的变量和函数的意义...

    Python 的代码风格由 PEP 8 描述.这个文档描述了 Python 编程风格的方方面面.在遵守这个文档的条件下,不同程序员编写的 Python 代码可以保持最大程度的相似风格.这样就易于阅读, ...

  4. Python中单个下划线“_”变量的目的是什么?

    在Python中,下划线_被视为" 我不关心 "或" 丢失 "变量 python解释器将最后一个表达式值存储到名为的特殊变量中_. >>> 1 ...

  5. python中不被定义_一日一技:在Python中双下划线私有方法不能被调用的原理

    一日一技:在Python中双下划线私有方法不能被调用的原理 在使用Python编写面向对象的代码时,我们会常常使用"继承"这种开发方式.例如下面这一段代码: class Info: ...

  6. python中的下划线_讲解

    python中,下划线 "_""_"" \_" 不管是单独作为变量名或者作为变量名的前缀或者后缀,是有特殊含义的,下面简要的来总结一下. 1 ...

  7. python中__init__下划线怎么打出来___init__()-------“_”下划线开头的函数

    1.linux kernel中双下划线开头的函数 常常, 当你查看内核 API 时, 你会遇到以双下划线(__)开始的函数名. 这样标志的函数名通常是一个低层的接口组件, 应当小心使用. 本质上讲, ...

  8. python 中的下划线

    Python 用下划线作为变量前缀和后缀指定特殊变量. _xxx 不能用'from module import *'导入 __xxx__ 系统定义名字 __xxx 类中的私有变量名 核心风格:避免用下 ...

  9. python中的下划线_Python中的下划线详解

    这篇文章讨论Python中下划线_的使用.跟Python中很多用法类似,下划线_的不同用法绝大部分(不全是)都是一种惯例约定. 一. 单个下划线直接做变量名(_) 主要有三种情况: 1. 解释器中 _ ...

最新文章

  1. Yolo(2)Yolo v2
  2. ASP中关于全局页面的作用 asax文件
  3. python csv读取-python如何读取csv数据
  4. Silverlight 5 Beta 新特性预览
  5. fixed在微信下的BUG
  6. LeetCode MySQL 1890. 2020年最后一次登录(year)
  7. ELK系列~对fluentd参数的理解
  8. 苹果cms v8模板 高仿爱奇艺带PC+手机模板
  9. JavaScript学习(四十六)—练习题
  10. Android office教程,Excel办公软件Office教程app
  11. 微信公众号h5 微信分享朋友 分享给朋友圈 分享给朋友
  12. 信捷PLC跟西门子700IE通信
  13. 78 python - 打飞机案例(让敌机移动)
  14. 面试官:为什么 0.1 + 0.2 == 0.300000004 ?
  15. Golang ToLower和ToLowerSpecial源码探究
  16. 【dev Cpp新手请进】dev导入ege图形库
  17. NOIP模拟 字符处理(送分or送命?)
  18. 【揭秘恒大老总许家印】迄今为止最深度、全面的
  19. CSS层叠样式表基础知识整理
  20. uvc摄像头代码解析之描述符

热门文章

  1. 手把手教程:零基础使用MATLAB完成基于深度学习U-Net模型的遥感影像分类
  2. Spring Boot 使用 Swagger3 生成 API 接口文档
  3. 数值计算之 线搜索法,Armijo,Wolfe,Goldstein条件,回溯法
  4. 外贸人如何把握客户跟进频率?
  5. Freemarker生成word文件,打开后页眉和页脚图片不显示
  6. 高性能服务器理论与计算化学,计算化学集群服务器简明使用指引-VLCC.PDF
  7. (戒急用忍)本来是要展望2019的,没想到重点不由自主的写成了回顾前几年的事情了
  8. Java中的反射用法
  9. html图片的宽度和高度设置,CSS设置img图片的宽度和高度
  10. 状态空间平均建模——Flyback