【问题标题】:What is the difference between super() with arguments and without arguments?super() 带参数和不带参数有什么区别?
【发布时间】:2020-01-16 14:46:24
【问题描述】:

我遇到了一个代码,它以两种不同的方式使用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() 方法参数?这些论点是什么?

【问题讨论】:

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


    【解决方案1】:

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

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

    • 第一个参数是定义使用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 调用非常罕见并且是一个相当高级的主题,所以我'会把他们排除在这个答案之外。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-05
      • 2010-09-14
      • 1970-01-01
      • 2014-11-23
      • 2018-02-19
      • 2011-05-14
      相关资源
      最近更新 更多