23

I have two classes one parent and other child.

class Parent(object):

    def __init__(self):
        #does something

    def method_parent(self):
        print "Parent"

class Child(Parent):

    def __init__(self):
        Parent.__init__(self)

    def method_parent(self):
        print "Child"

After inheriting the parent I want to modify Parent method method_parent keeping the original functionality of that method and adding some extra lines of code to that method.

I know that I can create a new method like

def method_child(self):
    self.method_parent()
    #Add extra lines of code to perform something 

But I want to use the original name of method. I can't copy the source for that method because, the method is from a C module

what I want to achieve is something like this

def method_parent():
    #do parent_method stuff
    #do extra stuff

Is that even possible?

Harwee
  • 1,601
  • 2
  • 21
  • 35

3 Answers3

24

You can always call code from the parent using the super() function. It gives a reference to the parent. So, to call parent_method(), you should use super().parent_method().

Here's a code snippet (for python3) that shows how to use it.

class ParentClass: 
    def f(self): 
        print("Hi!"); 

class ChildClass(ParentClass): 
    def f(self):
        super().f(); 
        print("Hello!"); 

In python2, you need to call super with extra arguments: super(ChildClass, self). So, the snippet would become:

class ParentClass: 
    def f(self): 
        print("Hi!"); 

class ChildClass(ParentClass): 
    def f(self):
        super(ChildClass, self).f(); 
        print("Hello!"); 

If you call f() on an instance of ChildClass, it will show: "Hi! Hello!".

If you already coded in java, it's basically te same behaviour. You can call super wherever you want. In a method, in the init function, ...

There are also other ways to do that but it's less clean. For instance, you can do:

ParentClass.f(self) 

To call the f function of parent class.

Moses Koledoye
  • 77,341
  • 8
  • 133
  • 139
Alexis Clarembeau
  • 2,776
  • 14
  • 27
4

This is what the super function does.

class Child(Parent):

    def __init__(self):
        super(Child, self).__init__()

    def method_parent(self):
        super(Child, self).method_parent()
        print "Child"

In Python 3, you can call super without the arguments, like super().method_parent()

Zah
  • 6,394
  • 1
  • 22
  • 34
1

You can call the parent method exactly the same way you used for the __init__ one:

class Child(Parent):

    def __init__(self):
        Parent.__init__(self)

    def method_parent(self):
        Parent.method_parent(self)  # call method on Parent
        print "Child"

This one is when you want to explicitely name the parent class. If you prefere, you can ask python to give you next class in Method Resolution Order by using super:

    def method_parent(self):
        super(Child, self).method_parent()  # call method on Parent
        print "Child"
Serge Ballesta
  • 143,923
  • 11
  • 122
  • 252