【问题标题】:What do parentheses do after a class is called?调用类后括号有什么作用?
【发布时间】:2016-04-30 15:13:30
【问题描述】:

我一直在尝试制作一个简单的播放器类,其中包含 python 中所有重要的播放器函数。当我注意到一个类使用括号时,我刚刚进入 pygame 模块。我花时间学习了一个类在 python 中的作用,但是,找不到为什么在一个类之后使用括号。这是我的主要代码。

class plr(pygame.sprite.Sprite):
    def __init__(self):
        plr.__init__(self)
        self.image = pygame.Surface((20,20))
        self.image.fill(black) 

有什么解释吗?

【问题讨论】:

  • 您要询问示例中的哪些括号? class 语句中的 (pygame.sprite.Sprite) 围绕基类。 pygame.Surface((20,20)) 中的双括号正在使用 2 元组作为单个参数(内括号)进行调用(外括号)。
  • (pygame.sprite.Sprite)

标签: class python-3.x pygame


【解决方案1】:

class 语句中行尾的括号围绕着您定义的类的基类。在常见情况下,只有一个基类(如果不需要其他基类,它可能是object)。在 Python 3 中,您可以省略基类并且默认使用 object,但您应该始终明确地将 object(或某个子类)命名为 Python 2 中的基类,否则您将得到一个“旧的- style" 类,这是你可能不想要的。 (旧样式类已经彻底过时,如果您是 Python 新手,则不值得学习。它们在 Python 3 中不再存在。)

指定基类可以让您的新类从基类继承方法和其他行为。继承是面向对象编程的关键部分,所以你可能会遇到很多!

在您的具体示例中,plr 类继承自 pygame.sprite.Sprite。这意味着您可以在plr 的实例上调用Sprite 方法,它们通常会正常工作。如果您想自定义对象的行为,可以覆盖其中的一些。

我确实在您的代码中看到了错误。您编写的__init__ 方法将无限递归,因为它调用plr.__init__,它本身就是!您可能希望它调用pygame.sprite.Sprite.__init__,这是最重要的。您可以使用我上面提到的长名称或使用super(更好)进行调用。试试:

class plr(pygame.sprite.Sprite):
    def __init__(self):
        super(plr, self).__init__()
        ...

【讨论】:

  • 解释得很好。顺便用的代码不对,但是我发问题后改了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多