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