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)
输出
当我们从类内部访问 Cricket Sports 时,上面的代码会为其命名并输出名称。您可以从下面的输出中看到,虽然我们可以直接访问 players,但我们无法对 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, inprint(object2.__f)AttributeError: 'PythonClass' object has no attribute '__f'
名称混淆在这里再次起作用。object2.f 被更改为 _PythonClass__f。现在,使用修改后的 Attribute 将该元素打印出来。
print(object2._PythonClass__f)
现在,输出如下:
overriding overriding overriding
示例
以下示例确定可以使用类的 methods 来访问双下划线前缀变量。
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, inprint(object.__getdatacamp()) AttributeError: 'Python' object has no attribute '__getdatacamp'
示例
让我们再来看一下名称混淆。我们首先创建一个名为 Python 的变量,然后尝试使用 Doble Pre Underscore 名称访问它。
_Python__name = "Programming" class Python: def return_name(self): return __name object = Python() # The __name variable gets printed print(object.return_name())
输出
以下是上述代码的输出:
Programming