文章目录
在Python中,下划线
_
有多种特殊用途和约定,涵盖了从语法特性到编程习惯的多个层面。以下是其主要应用场景的详细总结:
一、单下划线 _
的应用
1. 作为临时或无关紧要的变量
# 忽略循环索引
for _ in range(3):
print("Hello")
# 解包时忽略特定值
name, _, age = ("Alice", "Female", 30)
2. 交互式解释器中的上一个表达式结果
>>> 2 + 3
5
>>> _ * 2 # 使用_获取上一个结果
10
3. 国际化(i18n)中的翻译函数
import gettext
_ = gettext.gettext # 绑定翻译函数
print(_("Hello, World!"))
4. 在模块导入时隐藏变量
# module.py
_internal_var = 10 # 不会被from module import *导入
PUBLIC_VAR = 20
二、单下划线前缀 _var
的应用
1. 弱私有变量/方法(约定)
class MyClass:
def __init__(self):
self._private_var = 10 # 外部仍可访问,但约定不直接使用
def _private_method(self): # 同上
pass
2. 模块级私有(导入控制)
# 只导入未以下划线开头的成员
from module import * # 不会导入_module_var
三、双下划线前缀 __var
的应用
1. 名称修饰(Name Mangling)
class MyClass:
__private_var = 10 # 被重命名为 _MyClass__private_var
obj = MyClass()
print(obj._MyClass__private_var) # 可以访问,但不推荐
2. 避免子类覆盖方法
class Parent:
def __private_method(self): # 被重命名为 _Parent__private_method
pass
class Child(Parent):
def __private_method(self): # 被重命名为 _Child__private_method
pass
四、双下划线环绕 __var__
的应用
1. 魔法方法(特殊方法)
class MyClass:
def __init__(self): # 构造函数
pass
def __str__(self): # 对象转字符串
return "MyClass"
def __add__(self, other): # 加法运算符重载
return MyClass()
2. 内置属性
__name__ # 模块名
__doc__ # 文档字符串
__file__ # 文件名
__class__ # 对象的类
五、组合应用场景
1. 忽略多个值
# 使用*_忽略多个值
a, *_, b = (1, 2, 3, 4, 5) # a=1, b=5
2. 类中同时使用不同下划线
class Demo:
def __init__(self):
self.public = 1 # 公开属性
self._protected = 2 # 受保护属性(约定)
self.__private = 3 # 私有属性(名称修饰)
def __magic__(self): # 魔法方法
pass
六、总结对比表
符号 | 用途 | 示例 |
---|---|---|
_ | 临时变量、解释器结果、翻译 | for _ in range(3) |
_var | 弱私有(约定) | self._private_method() |
__var | 名称修饰(强私有) | self.__private_var |
__var__ | 魔法方法/内置属性 | __init__ , __name__ |
*_ | 解包时忽略多个值 | a, *_, b = (1, 2, 3, 4) |
注意事项
- 不要随意定义魔法方法:
__var__
格式是Python保留的,自定义可能导致冲突。 - 名称修饰不是真正的私有:仍可通过
_类名__变量名
访问,主要用于避免意外修改。 - 遵循社区约定:
_var
和__var
的区别是约定俗成的,Python不强制限制访问。
合理使用下划线可以提高代码的可读性和安全性,是Python编程中的重要实践。