Python私有实例变量行为

问题描述 投票:2回答:1

以下代码:

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 class private-members
1个回答
3
投票

[Python中的double下划线属性具有特殊的效果,它执行“名称修改”,即在运行时将属性__var转换为_A__var,即_<classname>__<attributename>

在您的示例中,当您将10分配给__var对象的属性a时,它实际上是在创建新属性 __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
© www.soinside.com 2019 - 2024. All rights reserved.