If your class is intended to be subclassed, and you have attributes that you do not want subclasses to use, consider naming them with double leading underscores and no trailing underscores. This invokes Python's name mangling algorithm, where the name of the class is mangled into the attribute name. This helps avoid attribute name collisions should subclasses inadvertently contain attributes with the same name.
Python mangles these names with the class name: if class Foo has an attribute named __a , it cannot be accessed by Foo.__a . (An insistent user could still gain access by calling Foo._Foo__a .) Generally, double leading underscores should be used only to avoid name conflicts with attributes in classes designed to be subclassed.
Okay, with that said and explained, let's hop into the code. We will create two class, parent and child class and both sharing the same method and same variable.
$ cat mangle.py
class Parent(object):
__name = "John Smith"
def __init__(self):
self.__alive = False
self.__parentAlive = False
def __show_age(self):
print "65"
class Child(Parent):
__name = "John Smith Junior"
def __init__(self):
super(Child, self).__init__()
self.__alive = True
self.__childAlive = True
def __show_age(self):
print "34"
now import this module into python interpreter and understand how mangling works.
$ python
Python 2.7.10 (default, Jun 1 2015, 16:21:46)
[GCC 4.9.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from mangle import Child
>>> johnny = Child()
>>> dir(johnny)
['_Child__alive', '_Child__childAlive', '_Child__name', '_Child__show_age', '_Parent__alive', '_Parent__name', '_Parent__parentAlive', '_Parent__show_age', '__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
>>> johnny._Child__alive
True
>>> johnny._Child__name
'John Smith Junior'
>>> johnny._Child__show_age()
34
>>> johnny._Parent__alive
False
>>> johnny._Parent__name
'John Smith'
>>> johnny._Parent__show_age()
65
>>>
So with this, it should be clear that the attributes that live in the python object will prepend with an underscore and the class name with the variable. Same wise applicable to the method name too.