何时调用超类方法?

时间:2012-10-05 16:35:38

标签: python override

我正在努力扩展由一组开发人员维护的项目。我的代码涉及从现有代码中覆盖类中的方法。令我感到不安的一点是,我不知道如何完全覆盖超类方法。

以下是说明:

def foo(self):
    return self.something

当我延伸这个时,我一般应该尝试:

(1)

def foo(self):
    old_something = super(Sub, self).foo()
    # my code
    return old_something

(2)

def foo(self):
    # my code
    return super(Sub, self).foo()

我确定没有普遍的答案,但默认是什么?例如,在CL中,如果未指定此行为,则方法组合中的默认限定符为:around,表示大小写(2)。但是,在Java中,例如,惯例是在覆盖它的方法的第一行调用super,即case (1)。 Python的方法是什么?

编辑:

如果我这样做:

$ find . -type f -name "*.py" | xargs grep '= super' | wc -l

在我工作的项目上,我得到更多点击,然后如果我这样做:

$ find . -type f -name "*.py" | xargs grep 'return super' | wc -l

出于好奇。对于你们中的一些人/大多数人来说,这是否适用? :)

2 个答案:

答案 0 :(得分:2)

这不是关于惯例,而是关于什么正确。你需要看看你所覆盖的方法是什么,它的合同是什么,并编写做正确的事情的代码。做一个“before”(方法结束时的超类调用),或者“after”(开头的超类调用),或者“around”(中间某处的超类调用),或者“覆盖”(no)根据方法的语义, all 可以是正确的超类调用。

当然,有时候真的没关系;代码也可以使用多个选项。在这种情况下,我会倾向于“之后”(超类首先调用,然后是你自己的代码),因为它有助于调试以按照从泛型到特定的顺序进行操作。

答案 1 :(得分:0)

如果您要覆盖的方法以任何方式修改类,并且您依赖于这些更改,请参考第一个方法,以便方法的逻辑可以以最初的任何方式影响类。

如果您的逻辑与父类中可能影响的任何方法完全分开,则使用第二种方法。这真的是操作顺序的问题,以及super()ed方法是否对类做任何事情,你依赖它来解决手头的真正问题

相关问题