python - 带参数和不带参数的 super() 有什么区别?

标签 python python-3.x class pygame super

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

我现在正在学习 pygame 模块,我的任务是创建一个继承自 SpriteBall 类是 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-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 调用非常罕见并且相当高级主题,所以我将把它们排除在这个答案之外。

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

关于python - 带参数和不带参数的 super() 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57945407/

相关文章:

python - 出于性能目的对 Tensorflow 中的一批图像进行推理的正确方法是什么

python - 在 Social-App-Django 中扩展用户模型或自定义管道

python - 在 Pandas DataFrame 中选择包含至少一个 True 值的列的最佳解决方案

python - 朴素贝叶斯多项式NB scikit-learn/sklearn

python - 从数据框中删除 bool 行

python - 为什么反汇编一个 python 类定义会显示两个相同的 LOAD_CONST 和类名?

python - Robot Framework f中的文件上传

python - 运行 python3 virtualenv 时使用 pip3 与 pip 有什么区别

JavaScript 堆栈溢出错误

java - 如何打印类的每个实例的访问器的输出?