Python中的下划线到底什么意思?

article/2025/10/3 20:52:25

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  except from__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,给大家准备了学习资源、好玩的项目,欢迎大家加入一起交流。


http://chatgpt.dhexx.cn/article/Nf448x7D.shtml

相关文章

WPF中的文字修饰——上划线,中划线,基线与下划线

我们知道,文字的修饰包括:空心字、立体字、划线字、阴影字、加粗、倾斜等。这里只说划线字的修饰方式,按划线的位置,我们可将之分为:上划线、中划线、基线与下划线。如图: 从上至下,分别为上划线…

Java方法重载中返回值的问题

不能通过设置不同的返回值来实现方法重载,这样设置的方法不一定会编译通过,但Class文件中可以共存。 如下 1. 例证 IDEA工具,JDK8测试: 2. 原因 参考自《深入理解Java虚拟机》(第3版),如图 在Java语言中,要重载&…

Java 方法重载简单小例子

简单讲,方法重载就是为了方便程序员记忆,比如你有say方法需要有好几个功能,写say1,say2又费事还弱智,就可以采用重载. package java03;public class demo1 {// 练习-------------------public int max(int number1, int number2)…

java 重载的特征_Java中方法的重载详解

一、方法的概念 在之前我们学习了方法的定义,方法实现指定功能的代码块的组合,基本的定义 如下: DEMO:定义一个方法 不需要return语句的方法 二、方法的重载 在开发中很可能在一个类中出现多个功能相似的方法,但是方法的命名要求是见名知意&a…

Java方法覆盖与方法重载

Ps:括号中的内容为自身理解,看到可以略过。本人喜欢想些乱七八糟的东西。 类继承:子类继承父类的状态和行为,同时也可以具有自己的特征。 (简单来讲,就是基因(非private)继承&#…

什么叫java方法重载?

方法重载是指在一个类中定义多个同名的方法,但要求每个方法具有不同的参数的类型或参数的个数。调用重载方法时,Java编译器能通过检查调用的方法的参数类型和个数选择一个恰当的方法。方法重载通常用于创建完成一组任务相似但参数的类型或参数的个数不同…

Java 方法重载习题答案

基础题目 第一题:语法练习 语法点:方法定义,方法重载 按步骤编写代码,效果如图所示: 编写步骤: 定义类 Test1,类中定义 main方法,定义int类型a为10, b为10.定义printNum方法,参数为(int iVar, int iVar…

java中方法重载

重载的三个要求:1.在同一个类中,2.同一个方法名(不用在意返回值),3.不同的参数(参数个数,参数类型) 使用重载可以记住一个方法名,使用不同形参,完成不同类似的…

JAVA方法重载优先级

JAVA方法重载优先级 该方法正常执行,没有报空指针异常,是因为调用了,String类中的如下方法: 由于图一valueOf方法中传入的参数为Object类型,所以调用了该方法。 接下来看上面的方法执行结果,报了空指针异…

ROS学习笔记(一)#ROS系统及RoboWare的安装

0.前言 本人目前研一在读,学习ROS机器人也有半年多了,开此博客决定把ROS学习从新捋一遍.目前使用Ubuntu 16.04 ROS-Kinetic。 1.ROS安装 电脑选择这个教程…

ubuntu18.04 安装 roboware-studio

RoboWare Studio是一个ROS集成开发环境。与ROS匹配性比起其他IDE更好,可以用它开发 ROS更加简单、并且在官网ros wiki中有详细的使用教程。本文主要是在Ubuntu18.04中安装RoboWare Studio。 1.输入指令安装必要的编译程序必须软件包 sudo apt-get install build-es…

ROS集成开发环境 --- RoboWare(安装及学习笔记)

后附 RoboWare中文教程网盘链接 DesignerStudioViewer RoboWare Studio是什么 v1.2.0 32位 debv1.2.0 64位 debv1.2.0 使用手册 pdf RoboWare Studio是一个ROS集成开发环境.使ROS开发更加直观、简单,并且易于操作.可进行ROS工作空间及包的管理,代码编…

ROS学习系列(一):ubuntu16.04下安装 ROS IDE RoboWare Studio 教程

1.下载RoboWare Studio安装包 不要信从官网下载http://www.roboware.me/#/home 这个网站压根就进不去。 从github上下载安装包,链接https://github.com/TonyRobotics/RoboWare/tree/master/Studio,参考手册这个网站也有。 注意版本: 例如目…

在Ubuntu18.04中安装ROS IDE RoboWare Studio 和Visual Studio Code

安装ROS IDE 前言一、安装RoboWare Studio二、安装Visual Studio Code参考文献 前言 一款好的开发工具可以是开发效率提升,ROS官方推荐了常用的ROS开发环境http://wiki.ros.org/IDEs,下文将介绍安装我常用的两种开发环境。 一、安装RoboWare Studio 首先&#xf…

ROS集成开发环境IDE----RoboWare开源

RoboWare中文官网: http://cn.roboware.me/#/home github: https://github.com/TonyRobotics/RoboWare-Studio 目前主要有三款软件产品:DesignerStudioViewer,如下 . . . ---- RoboWare Studio - Open Source RoboWare Studio…

Roboware Studio下载、安装、及解决办法

RoboWare官网:http://www.roboware.me/#/home 如果没有VPN我这里有资料链接: https://pan.baidu.com/s/17q5U1HlGGL0inqcxLuELmw 提取码: upav 选择合适的版本下载,注意32位与64位之分。下载完以后先不要着急安装,为了更好地使用RoboWare St…

Robotium

本文内容:基于Android Studio 的Android自动化测试框架Robotium的开发 版权声明:本文为原创文章,未经允许不得转载 博客地址:http://blog.csdn.net/kevindgk 简介 RobotiumRobotium Recorder 一白盒测试 创建Android项目安装Rob…

ROS笔记(4) RoboWare Studio 的安装

ROS笔记(4) RoboWare Studio 的安装 1. RoboWare Studio的下载2. RoboWare Studio的安装3. RoboWare Studio的开启4.打开工作区1. RoboWare Studio的下载 RoboWare Studio是ROS的一款IDE,基于微软开源的VSCode开发,功能比较强大,使得开发更加快速、简单,是目前较好用的R…

RoboWare Studio入门教程(一)

部分参考:https://blog.csdn.net/qq_41450811/article/details/80305846 应该从ROS的通信机制开始说起,话题通信机制和服务通信机制,还有一种参数管理机制本次不予展开。 本次先以服务通信机制为例子。 服务(Service&#xff0…

RoboWare安装教程

RoboWare Studio安装教程 通常ROS的程序都是用C和Python开发的,为了提高开发的效率,我们建议用IDE来写代码。目前在Ubuntu上已经有许多IDE支持ROS开发,比如Eclipse、Qt Creator。不过这些IDE配置起来会比较麻烦,推荐一款适配ROS的…