覆盖父类的方法

时间:2010-09-27 06:15:14

标签: python class methods subclass override

我看到人们一直在做的事情是:

class Man(object):
    def say_hi(self):
        print('Hello, World.')

class ExcitingMan(Man):
    def say_hi(self):
        print('Wow!')
        super(ExcitingMan, self).say_hi()  # Calling the parent version once done with custom stuff.

我从未见过的人在做的事情是:

class Man(object):
    def say_hi(self):
        print('Hello, World.')

class ExcitingMan(Man):
    def say_hi(self):
        print('Wow!')
        return super(ExcitingMan, self).say_hi()  # Returning the value of the call, so as to fulfill the parent class's contract.

这是因为我和所有错误的程序员挂在一起,还是有充分的理由?

3 个答案:

答案 0 :(得分:8)

我认为显式返回超类方法的返回值更为谨慎(除非极少数情况下孩子想要抑制它)。特别是当你不知道超级正在做什么的时候。同意,在Python中你通常可以查找超类方法并找出它的作用,但仍然如此。

当然,编写其他版本的人可能自己编写了父类,并且/或者知道它没有返回值。在那种情况下,他们决定不做和明确的退货声明。

答案 1 :(得分:5)

在示例中,您给出的父类方法没有显式的return语句,因此返回None。所以在这一案例中没有立竿见影的问题。但请注意,如果有人修改父级以返回值,我们现在可能需要修改每个子级。

我认为您的建议是正确的。

答案 2 :(得分:3)

我怀疑,至少在这种情况下,因为父函数没有返回任何内容,所以返回其结果没有意义。一般来说,当父函数确实返回一些东西时,我认为这是一个很好的实践。

真的,你是否返回超类所做的事情取决于你想要代码做什么。如果这是你想要的和适当的,那就去做吧。