所以我在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个?
答案 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'的原因。