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.)" If that doesn't make sense to you (it confuses the hell out of me), feel free to ignore it. I just thought I'd pass it along.
I am trying to figure out an example for: 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
class A:
def foo(self): print 'A.foo'
def bar(self): self.foo()
class B(A):
def foo(self): print 'B.foo'
if __name__ == '__main__':
a = A()
a.bar() # echoes A.foo
b = B()
b.bar() # echoes B.foo
... but both of these seem kind of obvious.
am I missing something that was hinted out in the quote?
edited typo of calling a.foo()
(instead of a.bar()
)and b.foo()
(instead of b.bar()
) in the original code
Yes, you're missing this:
b.bar() # echoes B.foo
B
has no bar
method of its own, just the one inherited from A
. A
's bar
calls self.foo
, but in an instance of B
ends up calling B
's foo
, and not A
's foo
.
Let's look at your quote again:
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
To translate:
bar
(method ofA
, the base class) callsself.foo
, but may in fact end up calling a method of the derived class that overrides it (B.foo
that overridesA.foo
)
Note, this won't work for private methods in Python 3.6:
class A:
def __foo(self): print 'A.foo'
def bar(self): self.__foo()
class B(A):
def __foo(self): print 'B.foo'
if __name__ == '__main__':
a = A()
a.bar() # echoes A.foo
b = B()
b.bar() # echoes A.foo, not B.foo
I spent an hour to find out the reason for this
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With