我正在努力扩展由一组开发人员维护的项目。我的代码涉及从现有代码中覆盖类中的方法。令我感到不安的一点是,我不知道如何完全覆盖超类方法。
以下是说明:
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
出于好奇。对于你们中的一些人/大多数人来说,这是否适用? :)
答案 0 :(得分:2)
这不是关于惯例,而是关于什么正确。你需要看看你所覆盖的方法是什么,它的合同是什么,并编写做正确的事情的代码。做一个“before”(方法结束时的超类调用),或者“after”(开头的超类调用),或者“around”(中间某处的超类调用),或者“覆盖”(no)根据方法的语义, all 可以是正确的超类调用。
当然,有时候真的没关系;代码也可以使用多个选项。在这种情况下,我会倾向于“之后”(超类首先调用,然后是你自己的代码),因为它有助于调试以按照从泛型到特定的顺序进行操作。
答案 1 :(得分:0)
如果您要覆盖的方法以任何方式修改类,并且您依赖于这些更改,请参考第一个方法,以便方法的逻辑可以以最初的任何方式影响类。
如果您的逻辑与父类中可能影响的任何方法完全分开,则使用第二种方法。这真的是操作顺序的问题,以及super()ed方法是否对类做任何事情,你依赖它来解决手头的真正问题