使用 ParentClass.method(self, *args, **kwargs) 还是 super(MyClass, self).method(*args, **kwargs)
当我们有一个类是从另一个类继承而来的时候,调用父类的方法有什么更好的方式呢?在我知道的情况下,有两种方法可以调用父类的方法。
选项 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
,那么父类有时候也必须使用