首页 > 解决方案 > super() 带参数和不带参数有什么区别?

问题描述

我遇到了一个以两种不同方式使用该super()方法的代码,我不明白逻辑上有什么区别。

我现在正在学习pygame模块,我有一个任务来创建一个Ball继承自模块Sprite的类的类pygame(如果我没记错的话)。

我遇到了这段代码:

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()方法参数?这些论点是什么?

标签: pythonpython-3.xclasspygamesuper

解决方案


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

两个参数调用和无参数调用是相同的,如果

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

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


但是,在极少数情况下,您实际上需要super使用不同的参数(使用 1 个或 2 个参数/-s)进行调用。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需要参数的调用非常罕见并且是一个非常高级的主题,因此我将把它们排除在这个答案之外。

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


推荐阅读