On Thu, Feb 25, 2016 at 11:59:21PM -0500, kay Cee wrote:
> Say I have a basic Circle class, for example:
>
> class Circle:
> def __init__(self, radius):
> self.__radius = radius
>
> Does adding the double underscore make this member directly inaccessible to
> children of the Circle class?
No, but it makes it harder to do so by accident and annoying to do so
deliberately. In order to access a double-underscore attribute like
__radius, the child needs to know the name of the class which defined
it:
class MyCircle(Circle):
def method(self):
try:
print(self.__radius)
except AttributeError:
print("__radius not found!")
r = self._Circle__radius
print("self._Circle__radius:", r)
And an example in use:
py> obj = MyCircle(999)
py> obj.method()
__radius not found!
self._Circle__radius: 999
What happens here is that when you refer to "self.__radius" inside a
method, Python mangles the name to "self._CLASSNAME__radius" instead.
(For whatever the class is actually named.) This happens automatically,
and is intended as protection against accidental name clashes between
the parent class and its children.
> Also, I'd like to know if there are any side effects to programming classes
> this way?
Yes, it's usually annoying and unnecessary.
The usual advice given is not to bother with double underscores unless
you are really, really sure you need them.
--
Steve
_______________________________________________
Tutor maillist - [email protected]
To unsubscribe or change subscription options:
https://mail.python.org/mailman/listinfo/tutor