使用 ParentClass.method(self, *args, **kwargs) 还是 super(MyClass, self).method(*args, **kwargs)

4 投票
1 回答
1068 浏览
提问于 2025-04-16 16:15

当我们有一个类是从另一个类继承而来的时候,调用父类的方法有什么更好的方式呢?在我知道的情况下,有两种方法可以调用父类的方法。

选项 1:

ParentClass.method(self, *args, **kwargs)

选项 2:

super(MyClass, self).method(*args, **kwargs)

选项 1 在处理多重继承时确实很有道理;因为我们想要明确地调用某个特定类的方法。但在单一继承的情况下,两种方法都可以用,虽然选项 1 可能更安全一些。有没有什么规定(比如 PEP)来说明什么时候使用哪种风格呢?

1 个回答

6

首先,如果你在使用老式的类,那就得用 选项 1

如果不是,那就要看你的代码:

  • 如果父类(或者子类)使用了 super(或者什么都不使用),那么你可以放心地使用 super。这也意味着你的子类 必须 使用 super,而不是 Parent.method(self, ...)
  • 如果父类(或者子类)使用的是老式的 Parent.method(self, ...),那你也要这样做。

这里有一个更详细的解释,可以参考 http://fuhm.net/super-harmful/。简单总结一下(比我上面的解释还简单):

  • 如果父类使用了 super,那么子类也必须使用
  • 如果子类使用了 super,那么父类有时候也必须使用

撰写回答