Python double underscore mangling

attributes, double-underscore, private-methods, python, python-3.x

Solution

Name mangling occurs during the evaluation of a `class` statement. In the case of `Bar`, the `__cache` attribute is not defined as part of the class, but rather added to a specific object after the fact.

(Actually, that may not be entirely correct. Name mangling may occur during the evaluation of the `__new__` method; I do not know. But regardless, your `__cache` is added explicitly to a single object, not added by the class code.)

Problem

I am a bit confused by this behavior (using 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} ``` I've read up a bit on how double-underscores cause attribute names to be "mangled", but I would have expected the same name-mangling in both cases above. What is the meaning of a single- and a double-underscore before an object name? Any ideas what's going on here?

Original source

Related problems