python

"看似简单,实则精微" —— 下划线 _ 在Python中虽小,却承载了多重含义。它不仅是语法符号,更是代码意图的传递者。

一、下划线的五大用途:不止是“临时变量”

1. 临时变量或忽略值

Python
for _ in range(10):
    print("Hello World")

📌 就像厨房里的一次性手套——随手可用但不重要

2. 国际化翻译函数

Python
import gettext
_ = gettext.gettext
print(_('Welcome'))  # 根据语言环境输出不同内容

📌 如同多语种标签贴在门上,让世界读懂您的程序

3. REPL中的历史记录

Python
>>> 3 + 4
7
>>> _ + 2
9

📌 像记事本一样记住您上一次的操作结果

4. 命名避免冲突(后缀下划线)

Python
class_ = "Python Class"
type_ = "example"

📌 "退一步海阔天空",加一个 _ 就能绕开关键字冲突

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

Python
million = 1_000_000  # 更易读
bytes_val = 0xCAFE_F00D  # 十六进制也适用

📌 就像把银行卡数字按千位分组,清晰又安心


二、单下划线前缀:温柔的“内部提示”

Python
class MyClass:
    def __init__(self):
        self._internal = "请勿随意访问"

📌 命名哲学

  • _var:这是内部使用的变量,请勿直接调用
  • 但要注意:这只是一个命名约定,不是真正的私有机制

"非礼勿视" —— 虽然你可以强行访问 obj._internal,但那不是规范做法


三、双下划短横线:名称改写的艺术

Python
class Base:
    def __init__(self):
        self.__private = "我是真的不想被继承"

class Derived(Base):
    pass

📌 名称改写原理
Base().__private 实际会被重命名为 _Base__private,避免子类意外覆盖父类属性

"画地为牢":虽然不能真正限制访问,但可以明确归属关系


四、前后双下划线:Python的“魔法契约”

Python
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"向量({self.x}, {self.y})"

📌 常见魔术方法

  • __init__:构造函数
  • __str__:字符串表示
  • __len__:定义长度行为
  • __call__:使对象可调用

"道可道非常道":这些以 __ 开头和结尾的方法,是Python语言层面定义的“神谕”。


五、模式匹配中的通配符(Python 3.10+)

Python
match status_code:
    case 200:
        print("OK")
    case 404:
        print("Not found")
    case _:  # 匹配任何未处理的值
        print("Unknown status")

📌 场景联想:就像打牌时的“百搭牌”,用来兜底所有未命中情况


六、最佳实践:如何优雅地使用下划线?

  1. 命名风格统一
  • 非必要不加 ___,保持简洁
  • 使用 _ 表示内部使用,__ 表示需要隔离
  1. 避免滥用name机制
  • 只实现官方定义的特殊方法
  • 不要自创 __my_method__,会污染命名空间
  1. 文档记录与团队沟通
  • 对于使用了 _ 的命名,应在文档中标注说明
  • 如何解释给新同事听?可以用“标记墙内区域”的方式说明
  1. 谨慎使用下划线后缀
  • class_type_ 等,用于避开关键字冲突
  • 这些“后缀”并非强制要求,但有助于提高代码可维护性

七、常见问题解答

Q1: 为什么我还能访问 obj.__private

因为Python没有真正意义上的私有机制,__private 会被改写为 _Class__private,仍然可以访问,只是不推荐。

Q2: _ 是变量还是函数?

两者都对!在某些项目中 _ 是gettext翻译函数,在交互式环境中是上一条结果的引用。

Q3: __init____private 有什么区别?

  • __init__ 是官方定义的“魔法方法”
  • __private 是触发名称改写的“伪私有”机制

“形而上者谓之道,形而下者谓之器” —— 合理使用下划线,是通往Python高级编程的第一步。


✅ 结语:下划线是Python的“隐形语法糖”

"大道至简" —— 看似简单的 ___,背后蕴含着Python设计者的智慧。它们既是命名的规范,也是模块化的桥梁。

📌 总结一句话

  • _:温和提醒,“这个变量/方法是内部的”
  • __:强力改写,“这个变量属于我的地盘”
  • __...__:Python系统方法,请勿擅自更改

记住这一句口诀吧:

“单下划线是礼貌,双下划线是策略,前后双下划线是契约。”

By 天海牧歌

东庵每见西庵雪,下涧长流上涧泉。 半夜白云消散后,一轮明月到窗前。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注