首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >从命名约定到特殊方法,Python下划线符号的妙用!

从命名约定到特殊方法,Python下划线符号的妙用!

原创
作者头像
云惑雨问
发布于 2025-04-03 09:53:08
发布于 2025-04-03 09:53:08
32400
代码可运行
举报
文章被收录于专栏:技术实操技术实操
运行总次数:0
代码可运行

作为Python开发者,下划线(_)可能是我们每天都会遇到的符号,但它却有着多种不同的含义和应用场景。本文将全面剖析Python中下划线的各种用法。

一、单下划线的多种用途

1. 临时变量或忽略值

在Python中,单下划线常用作临时变量名,表示该变量不重要或将被忽略:

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
# 忽略不需要的返回值
for _ in range(10):
    print("Hello")

# 解包时忽略某些值
x, _, z = (1, 2, 3)  # 忽略第二个值

2. 国际化(i18n)中的翻译函数

在gettext模块中,_常用作翻译函数的别名:

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
import gettext
gettext.bindtextdomain('myapp', '/path/to/locale')
gettext.textdomain('myapp')
_ = gettext.gettext

print(_('Hello World'))  # 根据locale返回翻译后的字符串

3. 交互式解释器中的特殊变量

在Python REPL中,_保存最后一次表达式的结果:

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
>>> 3 + 4
7
>>> _ + 2
9

二、单下划线前缀:保护成员

以单下划线开头的变量或方法表示"protected"成员,这是一种命名约定而非强制限制:

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
class MyClass:
    def __init__(self):
        self.public = 10
        self._protected = 20  # 提示这是内部使用
        
    def public_method(self):
        return self._protected
        
    def _protected_method(self):  # 提示子类可以覆盖
        return self.public

注意

  • 这些成员仍然可以从外部访问
  • from module import *不会导入以_开头的名称

三、单下划线后缀:避免关键字冲突

当变量名与Python关键字冲突时,可以添加下划线后缀:

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
class_ = "Python Class"  # 避免与class关键字冲突
type_ = "example"        # 避免与type内置函数冲突

四、双下划线前缀:名称改写(Name Mangling)

双下划线前缀会导致Python解释器对名称进行改写,主要用于避免子类中的命名冲突:

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
class MyClass:
    def __init__(self):
        self.__private = 30  # 会被改写为_MyClass__private
        
    def __private_method(self):  # 会被改写为_MyClass__private_method
        return self.__private

class SubClass(MyClass):
    def __init__(self):
        super().__init__()
        self.__private = 40  # 会被改写为_SubClass__private

实际访问方式:

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
obj = MyClass()
print(obj._MyClass__private)  # 可以这样访问,但不推荐

五、双下划线前后缀:特殊方法

前后都有双下划线的方法是Python的特殊方法(魔术方法):

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
class Vector:
    def __init__(self, x, y):
        self.x = x
        self.y = y
        
    def __add__(self, other):  # 实现+运算符
        return Vector(self.x + other.x, self.y + other.y)
        
    def __str__(self):  # 定义对象的字符串表示
        return f"Vector({self.x}, {self.y})"

常见特殊方法:

  • __init__: 构造函数
  • __str__: 字符串表示
  • __len__: 定义len()行为
  • __getitem__: 实现索引访问
  • __call__: 使实例可调用

六、其他特殊下划线用法

1. 数字分隔符(Python 3.6+)

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
million = 1_000_000  # 提高大数字可读性
bytes_val = 0xCAFE_F00D  # 十六进制同样适用

2. 模式匹配中的通配符(Python 3.10+)

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
match status_code:
    case 200:
        print("OK")
    case 404:
        print("Not found")
    case _:  # 匹配任何值
        print("Unknown status")

七、下划线使用的最佳实践

  1. 遵循命名约定:使用_前缀表示protected成员,__前缀表示private成员
  2. 不要滥用名称改写:除非确实需要避免子类命名冲突,否则慎用__前缀
  3. 特殊方法不要自定义:只实现Python定义的特殊方法,不要自创__方法
  4. 保持一致性:项目中应统一使用下划线的风格
  5. 考虑可读性_可以提高代码可读性,但过度使用会适得其反

八、常见问题解答

Q1: ___有什么区别?

  • _前缀:命名约定,提示protected成员
  • __前缀:名称改写,避免子类命名冲突
  • __前后缀:Python特殊方法

Q2: 为什么我的__private变量还能被访问?

  • Python没有真正的私有变量,__前缀只是触发了名称改写
  • 可以通过obj._ClassName__private访问,但不推荐这样做

Q3: 什么时候应该使用下划线后缀?

  • 主要在与Python关键字冲突时使用
  • class_type_

结语

在Python中,"显式优于隐式",下划线看似简单,实则内涵丰富,正是这一哲学的具体体现。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
并发编程-04线程安全性之原子性Atomic包的4种类型详解
并发编程-06线程安全性之可见性 (synchronized + volatile)
小小工匠
2021/08/17
3590
Java原子操作类,你知道多少?
由于synchronized是采用的是悲观锁策略,并不是特别高效的一种解决方案。 实际上,在J.U.C下的atomic包提供了一系列的操作简单,性能高效,并能保证线程安全的类去 更新基本类型变量,数组元素,引用类型以及更新对象中的字段类型。 atomic包下的这些类都是采用的是乐观锁策略去原子更新数据,在Java中则是使用CAS操作具体实现。
李红
2019/05/28
4250
Java并发编程(2)- 线程安全性详解
说到原子性,就不得不提及JDK里的atomic包,该包中提供了很多Atomic的类,本小节主要介绍该包中常用的几个类。这些类都是通过CAS来实现原子性的,atomic包提供了如下具有原子性的类:
端碗吹水
2020/09/23
3950
Java并发编程(2)- 线程安全性详解
java应用CAS
  CAS(Compare and Swap),即比较并替换。jdk里的大量源码通过CAS来提供线程安全操作,比如AtomicInteger类。下面我们来分析一下AtomicInteger是如何在多线程的环境下保证线程安全的。在AtomicInteger里定义了用于存值的value变量,与用于操作value的Unsafe以及value变量的偏移量。源码如下:
良辰美景TT
2018/09/11
9160
java应用CAS
jdk-Atomic源码学习
atomic是并发框架中的一员,所属位置:java.util.concurrent.atomic 该类主要是用来解决内存可见性、有序、线程安全,当然底层也是通过cas来实现,所以性能相同步锁也是高不少。
逍遥壮士
2023/02/28
3770
jdk-Atomic源码学习
Java并发编程与高并发之线程安全性(原子性、可见性、有序性)
1、并发的基本概念:同时拥有两个或者多个线程,如果程序在单核处理器上运行,多个线程将交替地换入或者换出内存,这些线程是同时存在的,每个线程都处于执行过程中的某个状态。如果允许在多核处理器上,此时程序中的每个线程都将分配到一个处理器核上,因此可以同时运行。并发,多个线程操作相同的资源,保证线程安全,合理利用资源。
别先生
2020/02/12
9860
Java并发编程与高并发之线程安全性(原子性、可见性、有序性)
JUC 中的 Atomic 原子类
Java1.5的Atomic包名为java.util.concurrent.atomic。
Vincent-yuan
2021/07/20
5710
JUC 中的 Atomic 原子类
java高并发系列 - 第23天:JUC中原子类,一篇就够了
JUC中的原子类都是都是依靠volatile、CAS、Unsafe类配合来实现的,需要了解的请移步: volatile与Java内存模型 java中的CAS JUC底层工具类Unsafe
路人甲Java
2019/12/10
5170
java高并发系列 - 第23天:JUC中原子类,一篇就够了
java并发编程-12个原子类
类签名:public class AtomicInteger extends Number implements java.io.Serializable {}
李福春
2025/07/01
620
java并发编程-12个原子类
Java原子操作Atomic类详解
      1.CAS(Compare And Swap,比较并交换),通常指的是这样一种原子操作:
忧愁的chafry
2022/10/30
7670
Java原子操作Atomic类详解
AtomicStampedReference解决CAS的ABA问题
AtomicStampReference 解决CAS的ABA问题 什么是ABA ABA问题:指CAS操作的时候,线程将某个变量值由A修改为B,但是又改回了A,其他线程发现A并未改变,于是CAS将进行值交换操作,实际上该值已经被改变过,这与CAS的核心思想是不符合的 ABA解决方案 每次变量更新的时候,把变量的版本号进行更新,如果某变量被某个线程修改过,那么版本号一定会递增更新,从而解决ABA问题 AtomicReference 演示ABA问题 package com.keytech.task; impo
开源日记
2021/01/11
4350
Java中的12个原子操作类
当程序更新一个变量时,如果多线程同时更新这个变量,可能得到期望之外的值。 比如变量 i = 1,A 线程更新 i+1,B 线程也更新i+1,经过两个线程操作之后可能 i 不等于 3,而是等于 2 。 因为 A 和 B 线程在更新变量 i 的时候拿到的 i 都是 1,这就是 线程不安全的更新操作,通常我们会使用 synchronized 来解决这个问题,synchronized 会保证多线程不会同时更新变量 i。
103style
2022/12/19
3460
Java中CAS算法的集中体现:Atomic原子类库,你了解吗?
在前面的博文中我们学习了volatile关键字,知道了它可以保证有序性和可见性,但无法保障原子性,结局原子性问题推荐使用synchronized、Lock或者AtomicInteger;我们还学习过CAS算法,在那篇博文中我们同样也提及atomic。那么今天,我们就来好好学一学Atomic原子库,一个基于CAS算法实现的高效并发工具库!
JavaBuild
2024/05/27
1420
Java中CAS算法的集中体现:Atomic原子类库,你了解吗?
线程安全之原子性Atomic(AtomicInteger|LongAdder|AtomicLong)
线程安全性 当多线程访问某个类时,不管运行环境采用何种调度方式或者这些进程将如何交替执行,并且在主调代码中不需要任何的同步或者协同,这个类都能表现出正确的行为,那么这个类就是线程安全的. 原子性 提供互斥访问,同一时刻只有一个线程对它进行访问. Atomic包 位于java.util.concurrent.atomic,AtomicXXX : CAS、Unsafe.compareAndSwapXXX CAS(Compare and swap)比较和替换是设计并发算法用的的一项技术,比较和替换是用一个期望值和
开源日记
2021/01/09
9110
慕课网高并发实战(四)- 线程安全性
当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些进程将如何交替执行,并且在主调代码中不需要额外的同步或协同,这个类都能表现出正确行为,那么就称这个类是线程安全的
Meet相识
2018/09/12
5740
慕课网高并发实战(四)- 线程安全性
"聊胜于无",浅析Java中的原子操作Unsafe类
Java放弃了指针,获得了更高的安全性和内存自动清理的能力。但是,它还是在一个角落里提供了类似于指针的功能,那就是sun.misc.Unsafe类,利用这个类,可以完成许多需要指针才能提供的功能,例如构造一个对象,但是不调用构造函数;找到对象中一个变量的地址,然后直接给它赋值,无视其final属性;通过地址直接操作数组;或者是进行CAS操作。例子如下:
JavaEdge
2018/05/16
1.6K0
全面了解 Java 原子变量类
保证线程安全是 Java 并发编程必须要解决的重要问题。Java 从原子性、可见性、有序性这三大特性入手,确保多线程的数据一致性。
静默虚空
2020/01/02
8960
【Java】原子类
保证线程安全是 Java 并发编程必须要解决的重要问题。Java 从原子性、可见性、有序性这三大特性入手,确保多线程的数据一致性。
后端码匠
2023/02/27
1.3K0
【Java】原子类
万字总结!全网最全的Java并发编程知识点
同时拥有两个或者多个线程,如果程序在单核处理器上运行多个线程将交替地换入或者换出内存,这些线程是同时“存在"的,每个线程都处于执行过程中的某个状态,如果运行在多核处理器上,此时,程序中的每个线程都将分配到一个处理器核上,因此可以同时运行.
JavaEdge
2021/12/07
1.7K0
万字总结!全网最全的Java并发编程知识点
长文慎入-探索Java并发编程与高并发解决方案(更新中)1 基本概念2 CPU3 项目准备4线程安全性5发布对象7 AQS9 线程池10 死锁
所有示例代码,请见/下载于 https://github.com/Wasabi1234/concurrency 高并发处理的思路及手段 1 基本概念 1.1 并发 同时拥有两个或者多个线程,如果
JavaEdge
2018/05/16
1K0
推荐阅读
相关推荐
并发编程-04线程安全性之原子性Atomic包的4种类型详解
更多 >
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档