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  -  Tutor@python.org
To unsubscribe or change subscription options:
https://mail.python.org/mailman/listinfo/tutor

Reply via email to