Python 中的名称修饰

2024 年 8 月 29 日 | 5 分钟阅读

在本教程中,我们将讨论 Python 中的名称修饰过程,以及我们如何使用 Python 中的名称修饰过程与不同的方法。

名称修饰

将任何给定的标识符,在其名称前有两个下划线,名称后有一个下划线,文本上替换为__ClassName__Identifier 的过程称为名称修饰。在__ClassName__Identifier 名称中,ClassName 是标识符所在当前类的名称。

图解

基本上,上面给出的名称修饰的定义意味着,任何形式为__Jtp 的标识符(在名称前至少有两个下划线,或在名称后最多有一个下划线)将被替换为__ClassName__Jtp(当前类的名称将替换 ClassName),并在 ClassName 中删除前导下划线(S)。

请看下面的例子来理解名称修饰过程。

示例

输出

JavaTpoint

说明

我们在上面的程序中定义了一个测试类,并在该类中有一个名称标识符。在测试类内部,我们定义了两个默认函数和一个名为PrintName()的函数。

PrintName()函数中,我们给出了打印名称的打印命令。然后,我们用测试类初始化了一个 t1 变量。最后,我们使用PrintName()来打印我们在初始化时在 Testing 类中使用的名称。

注意:如果我们尝试在类外部访问 Testing 类的函数和变量,它将引发错误。对 Testing 类中给出的变量所做的任何更改都只能在类内部完成!

示例:2

输出

JavaTpoint
Traceback (most recent call last):
  File "C:\Users\Manish\Downloads\code.py", line 12, in 
    print(t1.__name) # will throw an error in the output
AttributeError: 'Testing' object has no attribute '__name'

Python 中的名称修饰

Python 中名称修饰过程的实现与我们上面讨论的相同。我们将在 Python 程序中使用不同的方法来实现名称修饰过程并访问其中的变量。

在本节中,我们将执行以下任务:

  • 使用 dir() 方法在 Python 中进行名称修饰
  • 访问程序中的名称修饰变量
  • 在 Python 中使用方法重写进行名称修饰

我们将为每种方法使用一个程序来理解其在 Python 中的实现。

1. 使用 dir() 方法进行名称修饰

我们可以使用 dir() 方法来执行名称修饰过程,它将应用于代码中给定的类。Python 解释器将执行类的名称修饰过程。我们可以通过将定义的类对象传递给 dir() 方法来使用它,dir() 方法将返回属于给定类对象的所有有效属性。

请看下面的示例程序来理解这种名称修饰的 dir() 方法。

示例

输出

['_Testing__name', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']

说明

正如我们在输出中看到的,我们对初始化的变量 t1 使用的 dir() 方法返回了类 testing 的所有有效属性并打印了它们。我们还可以看到,标识符 __name 的名称被解释器更改为 _Testing__name。

2. 访问名称修饰变量

我们甚至可以在类外部访问名称修饰变量并将其打印在输出中(不像访问类变量那样会返回错误)。要在类外部访问名称修饰变量,我们只需在变量前添加 _ClassName,然后我们就可以在输出中打印该值。

请看下面的程序,我们在其中访问了测试类外部的名称修饰变量。

示例

输出

The name mangled that we are accessing outside the class:  JavaTpoint

说明

我们能够从外部访问 __name 变量,因为它是一个名称修饰变量,它返回了 name 值。

3. 使用方法重写进行名称修饰

由于我们在程序中使用名称修饰过程,我们受到限制,因为对私有类成员的有效用例支持有限。对私有类成员有效用例的有限支持是为了避免各种名称与子类中定义的名称发生冲突。只要名称修饰过程按照 Python 类的定义进行,解释器就会进行修饰。而且,它对于程序中的子类非常有帮助,可以让它们在不破坏类内方法调用的情况下覆盖方法。

让我们理解下面的例子。

示例

输出

Name mangling process done inside the parent testing class
Name mangling process done inside the child sub-testing class

结论

首先,在本教程中我们学习了名称修饰过程的介绍。我们还学习了如何使用 dir() 方法在 Python 中进行名称修饰。然后,我们在类外部访问了它们所在的名称修饰变量。最后,我们还学习了如何在程序中为给定的子类使用名称修饰过程和方法重写。