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

标签 python class private-members

下面这段代码:

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中的双下划线属性有一个特殊的作用,它会进行“名称修改”,即将属性__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/

相关文章:

css - 具有多个图像的多个类

c++ - C++中对象访问包含它的对象

python - 在 django 中向管理员显示多个选择

php - Python 脚本中关于 str(sys.argv[1]) 的错误

c++ - 单独文件中的简单类和标题不起作用

c++ - 如何使线程访问类的私有(private)成员

c++ - 无法从 .cpp 访问 .h 中声明的私有(private)成员

c++ - 未经授权的私有(private)类成员访问会产生编译时错误而不是运行时错误?

Python Popen WHOIS OS 命令失败测试

python - 如何用 python Tkinter 隐藏 Windows 控制台?