Python双下划线修改

时间:2012-11-21 16:52:50

标签: python attributes python-3.x private-methods double-underscore

我对这种行为感到有点困惑(使用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?

有什么想法在这里发生了什么?

2 个答案:

答案 0 :(得分:10)

在评估class语句期间发生名称重整。在Bar的情况下,__cache属性未定义为类的一部分,而是在事后添加到特定对象。

(实际上,这可能不完全正确。在评估__new__方法时可能会出现名称错误;我不知道。但无论如何,您的__cache被明确添加到单个对象中,不是由类代码添加的。)

答案 1 :(得分:7)

来自docs

  

私有名称修改:当在文本中出现的标识符时   类定义以两个或多个下划线字符开头   不会以两个或多个下划线结尾,它被认为是私人的   该类的名称。私人名称将转换为更长的形式   在为它们生成代码之前。转换插入   名称前面的类名,删除了前导下划线,以及   在类名前面插入一个下划线。例如,   名为Ham的类中出现的标识符__spam将是   转化为_Ham__spam。这种转变独立于   使用标识符的语法上下文。如果   转换后的名称非常长(超过255个字符),   实现定义截断可能发生。如果是班级名称   仅由下划线组成,不进行任何转换。

您在定义课程后分配您的财产