Python 中的双下划线

Vaibhhav Khetarpal 2023年1月30日
  1. 在 Python 中使用双前导下划线
  2. 在 Python 中使用双前导和尾随下划线
Python 中的双下划线

下划线 (_) 和双下划线 (__) 在 Python 编程世界中都具有重要意义,并且被程序员过度使用以用于不同目的。双下划线非常方便,在 Python 代码中经常遇到。

在本文中,我们将讨论 Python 中双下划线的含义。

在 Python 中使用双前导下划线

当双下划线引导给定标识符 (__var) 时,名称修改过程就会发生在该特定标识符上。

Name mangling,简单来说就是对属性名进行基本的改写,以防止与子类的命名冲突。

你可以使用以下代码来解释 Python 中的双前导下划线。

class E1:
    def __init__(self):
        self.bar = 11
        self._baz = 23
        self.__foo = 23


x = E1()
print(dir(x))

输出:

['_E1__foo', '__doc__', '__init__', '__module__', '_baz', 'bar']

解释

  • 在上面的代码中,我们拿一个类来比较单下划线、双下划线和普通元素。
  • 元素 foo, bar, baz 是简单的关键字,在这里用作占位符,用于在传递给程序的条件或程序收到的新信息时发生变化的值。
  • dir() 函数在此处用于提供作为函数参数传递的给定对象的有效属性列表。

在上面的代码中,我们注意到 bar_baz 变量看起来没有变化,而 __foo 变量已更改为 _E1__foo。这是在变量上发生名称纠缠的过程,这样做是为了保护变量不被子类覆盖。

这种带有前导双下划线的变量名称修改过程对程序员来说是完全透明的。名称修饰与双下划线开头的所有内容(包括函数)交互并更改。

在 Python 中使用双前导和尾随下划线

当一个变量在前后两边都被双下划线包围时,名称修改过程不适用于它。

Python 解释器将忽略由双下划线作为前缀和后缀聚集的变量。

你可以使用以下代码来解释 Python 中的双前导和尾随下划线。

class A:
    def __init__(self):
        self.__foo__ = 10


print(A().__foo__)

输出:

10

在上面的代码中,带有双下划线作为前缀和后缀的 foo 变量被解释器忽略,并且不会发生名称修饰。该函数的值作为输出返回,证明该变量存在于对象属性列表中。

一些独特的名称,如 initcall 同时包含前导和尾随双下划线,在 Python 语言中被保留用于特殊用途。

Vaibhhav Khetarpal avatar Vaibhhav Khetarpal avatar

Vaibhhav is an IT professional who has a strong-hold in Python programming and various projects under his belt. He has an eagerness to discover new things and is a quick learner.

LinkedIn

相关文章 - Python Syntax