Python 变量中双下划线前缀的作用是什么?


当在 Python 变量前添加双下划线作为前缀时,名称改编过程将应用于特定的标识符(__var)

为了避免与子类发生命名冲突,名称改编包括重写属性名称。

示例

以下是解释 Python 中双下划线的程序:

class Python: def __init__(self): self.car = 5 self._buzz = 9 self.__fee = 2 d = Python() print(dir(d))

输出

以下是上述代码的输出:

['_Python__fee', '__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__', '_buzz', 'car']

理解上述代码

  • 在上面的代码中,将一个类作为示例,比较了单下划线、双下划线和普通元素。

  • 此处使用基本的关键字 car、buzz 和 fee 作为占位符,用于表示根据输入条件或程序收到的新数据而可能发生变化的值。

  • 在此,dir() 函数提供了作为参数传递给函数的对象的有效属性列表。

在上面的代码中,car 和 _buzz 变量似乎不受影响,但 __fee 变量已更改为 _Python__fee。以这种方式对其执行名称改编,以防止变量在子类中被覆盖。双

下划线 (__) 前缀变量在 Python 中

在 Python 中,私有变量使用双下划线前缀定义。这有时也称为“dunder”。这些名称强制执行它们引用的变量的局部作用域。当在函数中使用双下划线声明变量时,Python 会对其名称进行改编,以便它无法超出作用域。

示例

以下是 Python 中双下划线前缀变量的示例:

我们将以名为 Python 的类为例。将向此类添加一个名为 __name 的函数可设置属性。此外,我们将创建一种方法供函数访问 __name 属性。

class Sports: def __init__(self, players): self.players = players def names(self, names): self.__names = names def GetName(self): return self.__names Cricket = Sports(12) Cricket.names("Sachin Tendulkar") print(Cricket.GetName()) print(Cricket.players) print(Cricket.__names)

输出

当我们从类内部访问板球运动时,上面的代码会为其命名并输出名称。您可以从下面的输出中看到,虽然我们可以直接访问球员,但我们无法对名称执行此操作。

Sachin Tendulkar12
Traceback (most recent call last):
   File "main.py", line 12, in <module>
print(Cricket.__names)AttributeError: 'Sports' object has no attribute '__names'

示例

为了演示如何覆盖函数,让我们创建一个从 Coding 类继承的新类。

class PythonClass(): def __init__(self): super().__init__() self.d = "overriding" self._e = "overriding" self.__f = "overriding" object2 = PythonClass() print(object2.d) print(object2._e) print(object2.__f)

输出

以下是上述代码的输出:

overriding
overriding
Traceback (most recent call last):
  File "main.py", line 12, in 
print(object2.__f)AttributeError: 'PythonClass' object has no attribute '__f'

名称改编在这里再次起作用。object2.f 更改为 _PythonClass__f。现在,使用修改后的属性打印该元素。

print(object2._PythonClass__f)

现在,输出如下:

overriding
overriding
overriding

示例

以下示例确定可以使用类的某些方法来访问双下划线前缀变量。

class Python: def __init__(self): self.__datacamp = "Programming" def get_datacamp(self): return self.__datacamp object = Python() # Printing the "Programming" that is a __var print(object.get_datacamp()) # An error occurs here. The name of the variable is changed print(object.__datacamp)

输出

以下是上述代码的输出:

Programming
Traceback (most recent call last):
  File "main.py", line 11, in <module>
print(object.__datacamp)
AttributeError: 'Python' object has no attribute '__datacamp'

示例

此外,对于方法名称,您可以使用双下划线前缀。

class Python: def __getdatacamp(self): return "Programming" def calling_datacamp(self): return self.__getdatacamp() object = Python() # Returning the double underscore prefix method print(object.calling_datacamp()) # An error occurs here print(object.__getdatacamp())

输出

以下是上述代码的输出:

Programming
Traceback (most recent call last):
  File "main.py", line 11, in 
    print(object.__getdatacamp())
AttributeError: 'Python' object has no attribute '__getdatacamp'

示例

让我们再看看名称改编。我们首先将创建一个名为 Python 的变量,然后我们将尝试使用双下划线前缀名称访问它。

_Python__name = "Programming" class Python: def return_name(self): return __name object = Python() # The __name variable gets printed print(object.return_name())

输出

以下是上述代码的输出:

Programming

更新于: 2022-11-23

5K+ 浏览量

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告