[Poll] Private variables
Tim Peters
tim_one at email.msn.com
Sun Sep 16 02:23:48 EDT 2001
[Christian Tanzer]
> Python 2.1 (#1, May 2 2001, 18:27:26)
> [GCC 2.7.2.1] on linux2
> Type "copyright", "credits" or "license" for more information.
> >>> class _A :
> ... __beep = 1
> ...
> >>> class A(_A) :
> ... __beep = 2
> ...
> >>> class B(A) :
> ... __beep = 3
> ...
> >>> dir (_A)
> ['_A__beep', '__doc__', '__module__']
> >>> dir(A)
> ['_A__beep', '__doc__', '__module__']
> >>> dir(B)
> ['_B__beep', '__doc__', '__module__']
> >>>
>
> The name mangling of `__bar` names misbehaves if the class name starts
> with a single underscore. To be able to use `__bar` names safely one
> has to avoid `_Foo` class names.
>
> This is the only example of accidental feature interaction in Python
> that I'm aware of.
It's not an accident: the compiler goes out of its way to remove leading
underscores from class names while mangling, and this behavior is documented
in section 5.2.1 (Identifiers -- Private name mangling) of the Ref Man.
Suppose it didn't do this. Then the mangled name in _A would be __A_beep,
and in A would (still be) _A_beep. How then in A would you be able to
access _A's version of beep? If you typed __A_beep within the scope of A,
it would get mangled to _A__A_beep: the point of the rule is so that a
mangled name never ever "looks like" a private name, so that in turn you can
always do the mangling by hand (when needed) and not have the compiler
interfere.
You could protest that if you *wanted* to access _A's beep from within A you
never would have made it a private name to begin with -- but Guido knows you
don't really mean that, so Python makes sure you can cheat despite your
idealistic intentions <wink>.
python-is-an-anti-terrorist-language-ly y'rs - tim
More information about the Python-list
mailing list