inheritance and private attributes

K

KN

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."
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
 
P

Peter Otten

KN said:
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:

change the above to
if self._A__value:
print "Ok."
else:
print "Empty."

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?

Python performs name mangling for attributes starting with two underscores.
This is meant to avoid accidental nameclashes of attributes that are rather
an implementation detail than of interest to subclasses and the wider
public. I like many others use attribute names with a *single* leading
underscore (i. e. no name mangling) to signal "this is may change without
prior notice" while omitting artificial hurdles.
This is also known as treating programmers as adults :)

Peter
 
A

A. Lloyd Flanagan

KN said:
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."

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):.... def __init__(self):
.... a.val = 3
.... def getValue(self):
.... return a.__val
.... def __init__(self):
.... a.__val = 3.... def __init__(self):
.... a.__init__(self)
.... def getValue(self):
.... return a._a__val + 2
....5
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,581
Members
45,057
Latest member
KetoBeezACVGummies

Latest Threads

Top