python - 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()
方法参数?这些论点是什么?
解决方案
在 Python-3.x 中,您通常不再需要参数super
。那是因为它们被神奇地插入(参见PEP 3135 -- New Super)。
两个参数调用和无参数调用是相同的,如果:
- 第一个参数是定义方法的类,它使用
super
. 在你的情况下,Ball
条件是满足的。 - 第二个参数 to
super
是方法的第一个参数。在您的情况下,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
需要参数的调用非常罕见并且是一个非常高级的主题,因此我将把它们排除在这个答案之外。
但是,如果您对差异感兴趣,有一些资源可能会有所帮助:
推荐阅读
- javascript - Angular - 动态操作过滤条件
- python - 在创建用户的同时创建配置文件
- android - Symbol$CompletionFailure:找不到 ActivityDeparturesBinding 的类文件
- c# - 如何在 asp.net webforms 的 UpdatePanel 内的 GridView 内使用 FileUpload 而无需回发
- yaml - GitLab CI 文件中 while 循环的正确语法
- java - 如何创建每 10 个正确问题提高一个级别的 FOR
- java - 我想在唯一的 post 键下访问 uid。我如何在 post 节点下访问该 post 密钥以访问 uid 并完成我的工作
- jquery - 拖放错误行为
- google-workspace - G Suite + 按域 Google Drive 中的类型计算文件数量
- javascript - 如何在以编程方式更改其值时触发选择上的更改事件