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, inprint(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, inprint(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