Python 语法精炼7
下划线常见用法
| 形式 | 名称 | 常见用途 | 示例 |
|---|---|---|---|
_ |
单下划线 | 临时变量 / 忽略值 / 上一次结果 | _ = 5,for _ in range(3) |
_var |
单前导下划线 | 弱“内部使用”标识(受保护属性) | _helper() |
__var |
双前导下划线 | 名称改写(Name Mangling),避免子类冲突 | self.__count |
var_ |
单尾下划线 | 避免与关键字冲突 | class_ = "MyClass" |
__var__ |
双前后下划线 | Python 特殊方法或魔术方法(magic methods) | __init__, __len__ |
下划线详细讲解
_ 单下划线
📌 含义 1:忽略的变量(占位符)
当变量值不重要时,使用 _ 表示“我不关心这个值”:
1 | for _ in range(5): |
表示循环 5 次,但不关心循环变量。
再比如:
1 | x, _, y = (1, 2, 3) |
忽略中间的值。
📌 含义 2:交互式解释器中上一个结果
在 Python REPL(交互模式)中,_ 保存上一次表达式的结果:
1 | 3 + 4 |
📌 含义 3:国际化(在某些框架中)
在 Django、Flask 等中,_ 常被用作翻译函数的别名:
1 | from gettext import gettext as _ |
_var 单前导下划线
表示“内部使用”,不建议外部直接访问。
在 Python 中这是一种 命名约定(convention),并不会强制限制访问,但在使用 from module import * 时,它会被忽略。
1 | # module.py |
1 | from module import * |
同时在类中:
1 | class MyClass: |
调用时建议只在类内部用,不是强制隐藏。
__var 双前导下划线
📌 用于避免子类命名冲突
Python 会自动改写这种属性的名字,加上类名作为前缀:
1 | class A: |
这种机制叫 Name Mangling(名称改写),主要用于继承时防止变量被子类覆盖。
✅ 实例:避免冲突
1 | class Base: |
var_ 单尾下划线
当变量名与 Python 关键字或内置函数冲突时,用下划线结尾。
1 | class_ = "MyClass" |
例如不能写:
1 | class = "MyClass" # ❌ SyntaxError |
__var__ 双前后下划线
Python 内部保留的命名约定,用于 特殊方法(magic methods) 或 系统钩子(hooks)。
例如:
| 方法 | 作用 |
|---|---|
__init__ |
构造函数 |
__str__ |
转为字符串时调用 |
__len__ |
调用 len(obj) 时触发 |
__iter__ |
可迭代对象 |
__call__ |
对象可被调用 |
这些方法是 Python 内部协议的一部分,不要随意自定义以 __xxx__ 命名的变量。
下划线总结对比表
| 形式 | 含义 | 使用场景 | 是否受保护 |
|---|---|---|---|
_ |
忽略值 / 上次结果 / 翻译函数 | 临时变量、循环、REPL | 否 |
_var |
模块或类内部使用 | 内部函数、内部变量 | 弱“私有” |
__var |
名称改写(防冲突) | 类属性、继承安全 | 是(改名) |
var_ |
避免与关键字冲突 | 关键字冲突 | 否 |
__var__ |
Python 内部保留名称 | 魔术方法 | 系统保留 |
下划线实践建议
✅ 建议:
- 使用
_表示无关变量。 - 使用
_var表示内部变量(弱保护)。 - 使用
__var仅在继承中需要防冲突时。 - 使用
var_避免关键字冲突。 - 不要自己定义
__var__除非遵守 Python 协议(如__init__、__str__)。
❌ 不建议:
- 滥用双下划线隐藏变量(调试不方便)。
- 伪造系统方法名(如自定义
__update__)。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Telason!
