Python中双下划线前缀有什么用途?
当Python变量的前缀添加双下划线时,名称编码过程被应用于特定标识符(__var)。
为了避免与子类产生命名冲突,名称编码包括重写属性名称。
更多Python相关文章,请阅读:Python 教程
例子
以下是用于解释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,但无法访问名称。
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 = "覆盖"
self._e = "覆盖"
self.__f = "覆盖"
object2 = PythonClass()
print(object2.d)
print(object2._e)
print(object2.__f)
输出
以下是上面代码的输出−
覆盖
覆盖
Traceback (most recent call last):
File "main.py", line 12, in <module>
print(object2.__f)AttributeError: 'PythonClass' object has no attribute '__f'
这里再次使用名称改编。object2.f更改为_PythonClass__f。现在,使用修改的属性将该元素打印出来。
print(object2._PythonClass__f)
现在,输出如下−
覆盖
覆盖
覆盖
示例
以下示例确定了类的方法可以用于访问双下划线变量。
class Python:
def __init__(self):
self.__datacamp = "编程"
def get_datacamp(self):
return self.__datacamp
object = Python()
# 打印“编程”,即__var
print(object.get_datacamp())
# 这里会产生一个错误。变量的名称已更改
print(object.__datacamp)
输出
以下是上面代码的输出−
编程
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 "编程"
def calling_datacamp(self):
return self.__getdatacamp()
object = Python()
# 返回带有双下划线前缀的方法
print(object.calling_datacamp())
# 此处会出现错误
print(object.__getdatacamp())
输出
以下是上述代码的输出-
编程
Traceback (most recent call last):
File "main.py", line 11, in
print(object.__getdatacamp())
AttributeError: 'Python' object has no attribute '__getdatacamp'
示例
让我们再来看看名称 mangling。我们首先创建一个叫作 Python 的变量,然后尝试使用双前置下划线名称访问它。
_Python__name = "编程"
class Python:
def return_name(self):
return __name
object = Python()
# __name 变量将被打印
print(object.return_name())
输出
以下是上述代码的输出-
编程
极客教程