puzzled about class attribute resolution and mangling

Brian van den Broek broek at cc.umanitoba.ca
Fri Dec 9 21:09:09 EST 2005


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





More information about the Python-list mailing list