inheritance and private attributes

A. Lloyd Flanagan alloydflanagan at comcast.net
Wed Apr 21 17:50:42 EDT 2004


KN <vald at dead.art.pl> wrote in message news:<mailman.874.1082573632.20120.python-list at python.org>...
> I've run into such problem:
> 
> I have something like this:
> 
> class A(object):
> 	def __init__(self):
> 		self.__value = None
> 
> class B(A):
> 	def test(self):
> 		if self.__value:
> 			print "Ok."
> 		else:
> 			print "Empty."
> 
> >>> b = B()
> >>> b.test()
> Traceback (most recent call last):
>   File "<stdin>", line 1, in ?
>   File "<stdin>", line 3, in test
> AttributeError: 'B' object has no attribute '_B__value'
> 
> Why I have no access to private attribute from a class that
> inherits other class? I just want to have access to the same
> private variables but also to extend its functionality by
> adding a method that operates on those private attributes and
> I'm unable to do so. 
> 
> Is this normal behaviour? What should I do if I want to 
> override method and use private attribute, or just add
> some other method which changes this attribute?
> 
> /K

This is normal behavior (by design).  In general a derived class has
no special access to the attributes defined in its parent; there is no
equivalent of C++'s "protected" variables.

I see two solutions:

1) Have the child use an accessor function (if class A above had a
getValue() method, you could call it with A.getValue(self)).

2) Cheat.  In class B, access self._A__value.  This duplicates the
"mangling" that python does to hide variables with double underscore
in front.

I'd recommend 1), unless you have some urgent performance problem.  2)
is probably a bit faster.

Fast example of 2):
>>> class a:
...   def __init__(self):
...     a.val = 3
...   def getValue(self):
...     return a.__val
...   def __init__(self):
...     a.__val = 3
>>> x = a()
>>> a.getValue()
3
>>> class b(a):
...   def __init__(self):
...     a.__init__(self)
...   def getValue(self):
...     return a._a__val + 2
...
>>> y = b()
>>> y.getValue()
5



More information about the Python-list mailing list