是否需要为python对象提供与其类相同数量的参数?

时间:2011-05-06 00:32:23

标签: python class pygame

所以我在pygame教程中遇到了这个类定义:

class GameObject:
        def _init_(self,image,height,speed):
                self.speed = speed
                self.image = image
                self.pos = image.get_squarerect().move(0,height)
        def move(self):
                self.pos = self.pos.move(0, self.speed)
                if self.pos.right > 600:
                        self.pos.left = 0
然后编码器执行此操作以使用对象填充数组(?):

objects = []
for x in range(10):
    o=GameObject(player, x*40, x)
    objects.append(o)   

我的问题是为什么在实例化对象时只传递了3个参数,但是这个类被接受了4个?

3 个答案:

答案 0 :(得分:1)

每个方法调用都会隐式提供self对象。

对于__init__,它是一个全新的对象,Python提供对该全新对象的引用作为自我。

对于__init__以外的方法调用,实际上提供了self引用的对象,而不是显式参数,但是在调用方法的对象中(object.method(foo)对应于,在对象类的定义中,“def method(self,foo)”)。

所以在你的例子中,__init__需要4个参数(包括self),但只调用3个(不包括self)。 “move”方法接受1个参数(self),但将使用0参数调用。

答案 1 :(得分:1)

隐式传递

self,它是对对象当前实例化的引用。这在官方教程中讨论:http://docs.python.org/release/2.7/tutorial/classes.html#random-remarks

答案 2 :(得分:0)

Python要求任何实例方法的第一个参数是您选择引用当前实例的任何名称。

使用名称'self'是一种惯例,应该严格遵守,但 只是一种约定。

如果您从未遇到过使用“自我”或“此”的语言,可以快速了解正在发生的事情:

定义一个类意味着你在一个框内编写代码(真正的'命名空间')供以后使用。 “稍后使用”基本上意味着您将实例化该类,从而创建一个对象。虽然您可以通过执行“myobj = myClass”来实例化您的对象,从而使您的对象名称为“myobj”,但在您实际编写该类代码时,无法知道它的名称。这就是你使用'self'的原因。