在不更改其名称的情况下向父类方法添加额外功能

Har*_*wee 12 python class

我有两个班,一个是父母,另一个是孩子.

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"
Run Code Online (Sandbox Code Playgroud)

继承父级后,我想修改Parent方法,method_parent保留该方法的原始功能,并为该方法添加一些额外的代码行.

我知道我可以创建一个新的方法

def method_child(self):
    self.method_parent()
    #Add extra lines of code to perform something 
Run Code Online (Sandbox Code Playgroud)

但我想使用方法的原始名称.我无法复制该方法的源代码,因为该方法来自C模块

我想要实现的是这样的

def method_parent():
    #do parent_method stuff
    #do extra stuff
Run Code Online (Sandbox Code Playgroud)

这甚至可能吗?

Ale*_*eau 10

您始终可以使用super()功能从父级调用代码.它给出了父母的参考.所以,要打电话parent_method(),你应该使用super().parent_method().

这是一个代码片段(用于python3),展示了如何使用它.

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

class ChildClass(ParentClass): 
    def f(self):
        super().f(); 
        print("Hello!"); 
Run Code Online (Sandbox Code Playgroud)

在python2中,你需要使用额外的参数调用super : super(ChildClass, self). 所以,该片段将成为:

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

class ChildClass(ParentClass): 
    def f(self):
        super(ChildClass, self).f(); 
        print("Hello!"); 
Run Code Online (Sandbox Code Playgroud)

如果您调用f()ChildClass的实例,它将显示:"嗨!您好!".

如果你已经用java编码,它基本上是相同的行为.您可以在任何地方打电话给超级.在一个方法中,在init函数中,......

还有其他方法可以做到这一点,但它不太干净.例如,你可以这样做:

ParentClass.f(self) 
Run Code Online (Sandbox Code Playgroud)

调用父类的f函数.