[Poll] Private variables
tanzer at swing.co.at
Sun Sep 16 09:44:59 CEST 2001
"Tim Peters" <tim_one at email.msn.com> wrote:
> > 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.
When was this documentation added? I don't remember reading that (back
in 1.5.x times; of course, my brain might just have chosen to
selectively ignore it).
Feature or bug, it still is an example of feature interaction waiting
to spring surprises on you.
> 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
I understand the difficulty. I still think it would have been better
to just use a different (and documented) mangling scheme for class
names starting with a single underscore (like ___A_beep <shudder>).
> 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>.
My use of `__` names isn't motivated by privacy. The `__` names work
well to allow each class in the hierarchy to have its own unique
variables if it chooses so -- that is handy for some design patterns.
That this variables are open for inspection is a bonus, IMHO.
My consequence is to never use `_Foo` class names. Too bad, that that
means that some classes might be imported by `from X import *` when
I'd rather they wouldn't.
Christian Tanzer tanzer at swing.co.at
Glasauergasse 32 Tel: +43 1 876 62 36
A-1130 Vienna, Austria Fax: +43 1 877 66 92
More information about the Python-list