Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

calling an overridden method from base class?

Tags:

python

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?


UPDATE

edited typo of calling a.foo() (instead of a.bar())and b.foo() (instead of b.bar()) in the original code

like image 543
Vaibhav Bajpai Avatar asked Jul 08 '11 06:07

Vaibhav Bajpai


2 Answers

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 of A, the base class) calls self.foo, but may in fact end up calling a method of the derived class that overrides it (B.foo that overrides A.foo)

like image 89
Eli Bendersky Avatar answered Nov 07 '22 04:11

Eli Bendersky


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

like image 23
Yakovlev Pavel Avatar answered Nov 07 '22 04:11

Yakovlev Pavel