以下是我所指的程序中的一段代码示例。我意识到我没有真正的这个概念,所以我在这里问。
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坐标中。我对此的理解是否正确?
答案 0 :(得分:3)
瑙。 = 0
,= 2
等不会初始化对象 - 它们只是函数的默认参数。例如:
def foo(x, y=20):
print x, y
foo(10, 30)
foo(10)
在您编写的代码中,这意味着您只需调用Chef()
,在构造函数中,变量y
,speed
和odds_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__
函数。