问题
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?
回答1:
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.
回答2:
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()
回答3:
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"
来源:https://stackoverflow.com/questions/37679421/adding-extra-functionality-to-parent-class-method-without-changing-its-name