super()有参数和无参数之间有什么区别?

时间:2019-09-15 15:11:09

标签: python python-3.x class pygame super

我遇到了一个以两种不同方式使用super()方法的代码,但我无法理解逻辑上的区别。

我现在正在学习pygame模块,我得到了一个创建Ball类的任务,该类继承自Sprite,而pygame是{{1}的类}模块(如果我没记错的话)。

我遇到了这段代码:

import pygame

class Ball(pygame.sprite.Sprite):

    def __init__(self, x, y):
        super(Ball, self).__init__()

我不明白与以下内容的区别:

import pygame

class Ball(pygame.sprite.Sprite):

    def __init__(self, x, y):
        super().__init__()

super()方法的参数)

这些代码块之间的逻辑区别是什么?为什么需要传递给super()方法参数?这些参数要求是什么?

1 个答案:

答案 0 :(得分:3)

在Python-3.x中,通常不再需要super的参数。这是因为它们是神奇插入的(请参见PEP 3135 -- New Super)。

两个参数调用和无参数调用是相同的 if

  • 第一个参数是使用super定义方法的类。您的情况是Ball,因此满足条件。
  • super的第二个参数是方法的第一个参数。在您的情况下,self是方法的第一个参数,因此也可以满足条件。

因此,在您的情况下,两个示例之间没有任何区别!


但是,在少数情况下,您实际上需要使用不同的参数(使用1或2个参数-s)来调用super。 super的文档是一个很好的起点:

>>> help(super)
Help on class super in module builtins:

class super(object)
 |  super() -> same as super(__class__, <first argument>)
 |  super(type) -> unbound super object
 |  super(type, obj) -> bound super object; requires isinstance(obj, type)
 |  super(type, type2) -> bound super object; requires issubclass(type2, type)
 |  Typical use to call a cooperative superclass method:

但是我认为您的问题主要是关于示例中的差异(没有差异),并且这些需要参数的super调用非常罕见,并且是一个非常高级的主题,所以我会把他们排除在这个答案之外。

但是,如果您对这些差异感兴趣,有些资源可能会有所帮助: