puzzled about class attribute resolution and mangling

  • Thread starter Brian van den Broek
  • Start date
B

Brian van den Broek

Hi all,

I've the following code snippet that puzzles me:

class Base(object):
__v, u = "Base v", "Base u"
def __init__(self):
print self.__v, self.u

class Derived(Base):
__v, u = "Derived v", "Derived u"
def __init__(self):
print self.__v, self.u
super(Derived, self).__init__()

d = Derived()

When run (Python 2.4.2, IDLE 1.1.2), it produces:
Derived v Derived u
Base v Derived u
What I expected was that all four emitted strings would contain "Derived".

I conclude that there is something about the cluster of concepts at
hand this hobbyist doesn't understand :) I suspect that the problem
is with my understanding of the name mangling mechanism, but then
again, I'm the confused one.

I'd thought the point of the mangling was to make it sufficiently
difficult for client code to access the mangled name so as to
constitute a strong recommendation to leave the name alone. But, since
the access is all from within method code, I didn't expect any
mangling issues here. Since d is a Derived, I expected any method of d
trying to find d.__v to first check if there is a Derived.__v and only
then pass to Base.__v. Obviously, that's not what's happening.

So, is this behaviour entirely by design and my surprise entirely the
product of misconception or is there an element of side effect of the
mangling mechanism at issue? Or some other consideration altogether?

Thanks and best,

Brian vdB
 
J

James Stroud

Brian said:
Hi all,

I've the following code snippet that puzzles me:

class Base(object):
__v, u = "Base v", "Base u"
def __init__(self):
print self.__v, self.u

class Derived(Base):
__v, u = "Derived v", "Derived u"
def __init__(self):
print self.__v, self.u
super(Derived, self).__init__()

d = Derived()

When run (Python 2.4.2, IDLE 1.1.2), it produces:

Derived v Derived u
Base v Derived u

What I expected was that all four emitted strings would contain "Derived".

I conclude that there is something about the cluster of concepts at
hand this hobbyist doesn't understand :) I suspect that the problem is
with my understanding of the name mangling mechanism, but then again,
I'm the confused one.

I'd thought the point of the mangling was to make it sufficiently
difficult for client code to access the mangled name so as to
constitute a strong recommendation to leave the name alone. But, since
the access is all from within method code, I didn't expect any mangling
issues here. Since d is a Derived, I expected any method of d trying to
find d.__v to first check if there is a Derived.__v and only then pass
to Base.__v. Obviously, that's not what's happening.

So, is this behaviour entirely by design and my surprise entirely the
product of misconception or is there an element of side effect of the
mangling mechanism at issue? Or some other consideration altogether?

Thanks and best,

Brian vdB

This is name mangling at work. Mangling turns self.__v in the Derrived class's
__init__ method to self._Derrived__v and self.__v in the Base class's __init__
method to self._Base__v. These are different names bound to different values and
are reflected as such. self.u is the same name in both cases and the value was
bound in the Derrived class, and not re-bound in the Base class.

James
 
B

Brian van den Broek

James Stroud said unto the world upon 2005-12-09 20:39:
This is name mangling at work. Mangling turns self.__v in the Derrived class's
__init__ method to self._Derrived__v and self.__v in the Base class's __init__
method to self._Base__v. These are different names bound to different values and
are reflected as such. self.u is the same name in both cases and the value was
bound in the Derrived class, and not re-bound in the Base class.

James

Thanks for the reply, James. Rereading the relevant section of the
Tutorial:
<http://docs.python.org/tut/node11.html#SECTION0011600000000000000000>

I'm not sure how I came to think that names were mangled only with
respect to calling code from outside class definitions.

As I'd been confused, I naturally started thinking of ways to clarify
the docs. But, I've come to think that the error was wholly mine.

Thanks for the help,

Brian vdB
 

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

Forum statistics

Threads
473,773
Messages
2,569,594
Members
45,113
Latest member
Vinay KumarNevatia
Top