gpt4 book ai didi

Python 私有(private)实例变量行为

转载 作者:太空宇宙 更新时间:2023-11-03 23:53:26 25 4
gpt4 key购买 nike

下面这段代码:

class A:
def __init__(self):
self.__var = 123
def getV(self):
return self.__var
a = A()
a.__var = 10
print a.getVar(), a.__var

打印 123 10。为什么会出现这种行为?我希望 a.getVar() 打印出 10。该类是否在内部将 self.__var 解释为 self._A__var?

最佳答案

Python 中的双下划线属性有一个特殊的作用,它做“name mangling”,就是把属性__var_A__var_<classname>__<attributename>在运行时。

在您分配 10 的示例中到属性 __vara对象,它实际上是在创建一个新属性 __var并且不修改 self.__var .这是因为 self.__var现在是_A__var由于名称修改。

如果你打印 __dict__ 就可以看到的 a对象:

class A:
def __init__(self):
self.__var = 123
def getV(self):
return self.__var
a = A()
print (a.__dict__)

>> {'_A__var': 123}

如果您不为 __var 分配任何值并尝试直接打印它,结果将是 AttributeError :

class A:
def __init__(self):
self.__var = 123
def getV(self):
return self.__var
a = A()
print (a.__var)

>> AttributeError: 'A' object has no attribute '__var'

现在,如果您尝试分配给新的损坏的属性名称,您将得到正确的结果(但此过程旨在防止意外使用此类变量):

class A:
def __init__(self):
self.__var = 123
def getV(self):
return self.__var
a = A()
a._A__var = 10
print (a.getV())

>> 10

关于Python 私有(private)实例变量行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58602514/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com