简体   繁体   中英

calling an overridden method from base class?

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

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 )

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM