Over(joy)riding

Terry Reedy tjreedy at udel.edu
Wed Feb 17 14:57:23 EST 2010


On 2/17/2010 8:53 AM, mk wrote:
> Found in Dive into Python:
>
> """Guido, the original author of Python, explains method overriding this
> way: "Derived classes may override methods of their base classes.
> Because methods have no special privileges when calling other methods of
> the same object, a method of a base class that calls another method
> defined in the same base class, may in fact end up calling a method of a
> derived class that overrides it. (For C++ programmers: all methods in
> Python are effectively virtual.)" """
>
> So, I set out to create such case:
>
> class A(object):
> def __init__(self):
> print "A"
>
> def met(self):
> print "I'm A's method"
>
> def overriden(self):
> print "I'm A's method to be overriden"
>
> def calling_overriden(self):
> self.overriden()
>
> class B(object):
> def __init__(self):
> print "B"
>
> def met(self):
> print "I'm B's method"
>
>
> class C(A):
> def __init__(self, arg):
> print "C","arg=",arg
> A.__init__(self)
>
> def met(self):
> print "I'm C's method"
>
>
> class D(B):
> def __init__(self, arg):
> print "D", "arg=",arg
> B.__init__(self)
>
> def met(self):
> print "I'm D's method"
>
>
> class E(C,D):
> def __init__(self, arg):
> print "E", "arg=",arg
> C.__init__(self, arg)
> D.__init__(self, arg)
>
> def some(self):
> self.met()
>
> def overriden(self):
> print "I'm really E's method"
>
> e = E(10)
> print 'MRO:', ' '.join([c.__name__ for c in E.__mro__])
> e.some()
> e.calling_overriden()
>
>
> Result:
> ...
> MRO: E C A D B object
> I'm C's method
> I'm really E's method
>
>
> Is what I concocted in e.calling_overriden() == what Guido said on base
> class sometimes calling overriden method instead of its own original
> method?

Much more complicated than needed for this point, but I believe yes.





More information about the Python-list mailing list