如何解决在Python中访问类的** private **变量
我了解Python不明确支持类中的私有变量。但是,请考虑以下程序:
class AClass(object):
def __init__(self,x):
self.__x = x
class BClass(object):
def __init__(self,x):
self.__x = x
# _____________________________________________________________________________
aClass = AClass(10)
bClass = BClass(10)
aClass.__x = 15
print (aClass.__x)
##bClass.__x = 20
print (bClass.__x)
上面的程序,将产生以下错误: AttributeError:'BClass'对象没有属性'__x'
但是,如果第二行代码未注释,它将执行而不会出错。
如果有人可以澄清似乎不一致的地方,并且有一个PEP可以解释这种行为,我将向您指出一个提示。
最诚挚的问候。
BD
解决方法
这是因为对以dunder开头的变量进行了名称修饰,以“保护”它们。如果您查看bClass
的字典,则会看到:
>>> print(bClass.__dict__)
{'_BClass__x': 10,'__x': 20}
_BClass__x
(我将其称为对象变量)是由对象本身创建的,因此是其错误的名称。 __x
是在类(a)的外部中创建的,这就是为什么它有一个无名称的原因,因此为什么只用{ {1}}。
要访问两种类型的对象变量,可以使用:
__x
但是我不确定这有多可靠。我 am 确定这是您可能不应该做的事,因为它破坏了封装:-)
实际上,尽管我说过整改是由对象完成的,但我想确保您了解实例化对象时并未完成。实际的处理发生在代码被编译时,您可以查看是否需要反汇编:
print (aClass._AClass__x)
print (bClass._BClass__x)
>>> import dis
>>> dis.dis(AClass)
Disassembly of __init__:
3 0 LOAD_FAST 1 (x)
2 LOAD_FAST 0 (self)
4 STORE_ATTR 0 (_AClass__x)
6 LOAD_CONST 0 (None)
8 RETURN_VALUE
字节码实际上知道使用错误的名称。
(a)与对象变量有很大的区别,当您以后尝试使用STORE_ATTR
时会感到困扰。在成员函数中,发现您的外部代码未更改它:-)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。