我对这种行为感到有点困惑(使用python 3.2):
class Bar:
pass
bar = Bar()
bar.__cache = None
print(vars(bar)) # {'__cache': None}
class Foo:
def __init__(self):
self.__cache = None
foo = Foo()
print(vars(foo)) # {'_Foo__cache': None}
我已经读过一些关于双下划线会如何导致属性名称被“损坏”的内容,但在上述两种情况下我都希望使用相同的名称 - 错误。
What is the meaning of a single- and a double-underscore before an object name?
有什么想法在这里发生了什么?
答案 0 :(得分:10)
在评估class
语句期间发生名称重整。在Bar
的情况下,__cache
属性未定义为类的一部分,而是在事后添加到特定对象。
(实际上,这可能不完全正确。在评估__new__
方法时可能会出现名称错误;我不知道。但无论如何,您的__cache
被明确添加到单个对象中,不是由类代码添加的。)
答案 1 :(得分:7)
来自docs
私有名称修改:当在文本中出现的标识符时 类定义以两个或多个下划线字符开头 不会以两个或多个下划线结尾,它被认为是私人的 该类的名称。私人名称将转换为更长的形式 在为它们生成代码之前。转换插入 名称前面的类名,删除了前导下划线,以及 在类名前面插入一个下划线。例如, 名为Ham的类中出现的标识符
__spam
将是 转化为_Ham__spam
。这种转变独立于 使用标识符的语法上下文。如果 转换后的名称非常长(超过255个字符), 实现定义截断可能发生。如果是班级名称 仅由下划线组成,不进行任何转换。
您在定义课程后分配您的财产