2

我正在扩展由一组开发人员维护的项目。我的代码涉及从现有代码覆盖类中的方法。让我感到不舒服的一点是我不知道如何准确地覆盖超类方法。

以下是说明:

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,表示 case (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

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

4

2 回答 2

2

这不是关于惯例,而是关于什么是正确的。您需要查看您要覆盖的方法是做什么的,以及它的契约是什么,并编写做正确事情的代码。执行“之前”(方法末尾的超类调用)或“之后”(开头的超类调用)或“周围”(中间某处的超类调用)或“覆盖”(不超类调用)都可以正确的,具体取决于方法的语义。

当然,有时候真的没关系;该代码将与多个选项一样正常工作。在这种情况下,我会倾向于“之后”(首先调用超类,然后是您自己的代码),因为它有助于调试以使操作按从通用到特定的顺序进行。

于 2012-10-05T16:41:59.983 回答
0

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

如果您的逻辑与该方法在父类中可能影响的任何内容完全不同,请使用第二种方法。这实际上是一个操作顺序问题,以及 super()ed 方法是否对类做任何事情,你依赖它来解决手头的实际问题

于 2012-10-05T16:38:54.573 回答