【问题标题】:What is this use of __init__ for?__init__ 有什么用?
【发布时间】:2013-05-01 08:04:49
【问题描述】:

我对 python 还很陌生,我正在阅读一本关于使用 pygame 创建游戏的书。我在书中遇到了这段代码。我不明白为什么Sprite.__init__(self) 是必要的。我已经运行了带有注释的代码,并且运行方式相同。

class Creep(Sprite):

    def __init__(   
            self, screen, img_filename, init_position, 
            init_direction, speed)

        Sprite.__init__(self)

        self.screen = screen
        self.speed = speed
        self.base_image = pygame.image.load(img_filename).convert_alpha()
        self.image = self.base_image

有人知道为什么会出现这种情况以及为什么人们称其为 init

【问题讨论】:

  • 它只是一个特殊的方法,充当实例化类对象的构造函数。 (甚至还有一个用于创建类的构造函数)如果你不想,你就不需要它。 self 只是一个约定名称this。这样想,像__init__ 这样的类方法需要一个自身的引用,并且第一个参数总是self。但是有一个例外:类中的静态方法。但是,在您了解 init 和 self 目的之前,我们不要到达那里。
  • Sprite(self) 将实现与Sprite.__init__(self) 相同的功能,但要创建一个实例来执行此操作。这种用法有点奇怪,因为它调用__init__ 方法而不获取结果实例。
  • 刚刚注意到class Creep(Sprite): - 看起来这相当于在当前类上执行super(Creep, self).__init__()
  • 不是重复的,OP 不是在问__init__ 方法是什么,而是在问为什么在其中调用Sprite.__init__

标签: python class initialization


【解决方案1】:

这是调用超类的初始化方法。据推测,Sprite 做了一些您在子类中也需要的初始化,而在 Python 中您需要显式调用它。

不过,通常情况下,您会通过调用super

super(Creep, self).__init__()

【讨论】:

  • 好的。我想我对发生的事情有一个模糊的想法。 Creep 类还需要访问 Sprite 对象的初始化调用中包含的某些变量吗?如果我的行话有点不对,请原谅我。对编程非常陌生。
猜你喜欢
  • 2013-07-27
  • 1970-01-01
  • 2013-06-02
  • 2023-01-16
  • 2012-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-30
相关资源
最近更新 更多