理解super()和关于类构造函数的问题

时间:2011-06-29 19:27:37

标签: python class super

以下是我所指的程序中的一段代码示例。我意识到我没有真正的这个概念,所以我在这里问。

class Chef(games.Sprite):
    """
    A chef which moves left and right, dropping pizzas.
    """
    image = games.load_image("chef.bmp")

    def __init__(self, y = 0, speed = 2, odds_change = 200):
        """ Initialize the Chef object. """
        super(Chef, self).__init__(image = Chef.image,
                                   x = games.screen.width / 2,
                                   y = 55,
                                   dx = speed)

        self.odds_change = odds_change
        self.time_til_drop = 0

这就是我认为的情况:

第六行def __init__(self, y = 0, speed = 2, odds_change = 200)为对象提供其初始值和内核中包含的值:

super(Chef, self).__init__(image = Chef.image, x = games.screen.width / 2, y = 55,dx = speed)在初始化之后处理对象的这些值。使第六行值相当于任意。例如,我能够将第六行构造函数中的y值更改为任意任意数,并且该对象保持在屏幕上的相同y坐标中。我对此的理解是否正确?

2 个答案:

答案 0 :(得分:3)

瑙。 = 0= 2等不会初始化对象 - 它们只是函数的默认参数。例如:

def foo(x, y=20):
    print x, y
foo(10, 30)
foo(10)

在您编写的代码中,这意味着您只需调用Chef(),在构造函数中,变量yspeedodds_change的值将会是默认值。

但是,这不会设置实例变量。设置它们的代码位于games.Sprite的构造函数(Chef的超类)中。

答案 1 :(得分:2)

super实际上做的是调用父类的相应方法。 http://docs.python.org/library/functions.html#super
因此,在您的情况下,您从定义的类__init__中调用类games.Sprite的{​​{1}}方法

虽然您在第六行中更改了y,但是因为您没有更改要传递给Chef函数的参数y=55,所以您将对象放在相同位置的原因。如果您将此y更改为其他内容,您的对象肯定会移动。

使用super时的一般做法是传递与super方法相同的参数。在您的代码中,您没有将__init__的任何参数传递给__init__,因此super(Chef, self).__init__中定义的参数或多或少都没有意义。所以你的代码应该是这样的 -

__init__

Rem,你可以在class Chef(games.Sprite): """ A chef which moves left and right, dropping pizzas. """ image = games.load_image("chef.bmp") def __init__(self, x = games.screen.width / 2, y = 55, speed = 2, odds_change = 200): """ Initialize the Chef object. """ super(Chef, self).__init__(image = Chef.image, x = x, y = y, dx = speed) # although this will work, you should either rename dx as speed or vice-versa self.odds_change = odds_change self.time_til_drop = 0 方法中获取更多参数,然后传递给__init__函数。