使用self.size = size时出现无效语法

1 投票
1 回答
6899 浏览
提问于 2025-04-17 17:10

我刚刚接触Python和编程,还是个新手。我有一个应该很简单的问题。我正在使用一本关于Python的初学者书籍,书中用的是Python 3.1版本。

我现在在写书里的一个程序,正在学习在Python中缩进有多重要,所以我在修正我发现的错误。当我到达这行代码 self.size = size 时,代码块中的 self 被标记为 无效语法,但我照着手册逐字输入,所以我不太确定我哪里出错了。这里是代码块:

def _init_(self, x, y, size):
    """ Initialize asteroid sprite. """
    super(Asteroid, self)._init_(
    image = Asteroid.images[size],
    x = x, y = y,
    dx = random.choice([1, -1]) * Asteroid.SPEED * random.random()/size,
    dy = random.choice([1, -1]) * Asteroid.SPEED * random.random()/size

    self.size = size 

问题出在最后一行,它把self标记为无效语法,但其他地方没有问题……还有最后一点,当我把这个代码块放到命令行中运行时,它也给我一个语法错误,但不是同样的错误,它在这个块的第一行冒号后面给我一个错误,并把整个空白区域标红……我搞不清楚为什么。我把它放在命令行中是想让它帮我高亮显示self的问题,但结果却显示了完全不同的错误。

任何帮助都会非常感谢!谢谢!

1 个回答

4

你忘记关闭括号了。

通常,当你忘记关闭某个括号时,程序会把错误指向下一行:

def _init_(self, x, y, size):
    """ Initialize asteroid sprite. """
    super(Asteroid, self)._init_(    <-- here you have a parentheses opening
        image = Asteroid.images[size],
        x = x, y = y,
        dx = random.choice([1, -1]) * Asteroid.SPEED * random.random()/size,
        dy = random.choice([1, -1]) * Asteroid.SPEED * random.random()/size  <-- no more commas here

    self.size = size  <-- first line without a trailing comma OR parentheses: SYNTAX ERROR HERE! (even though the assignment itself is ok)

也许书里的意思其实是这样的——正如Martijn Pieters指出的,某些self.__init__的参数(xy)是传给父类的__init__方法的,而其他参数则是在别处读取的(image)或者是动态创建的(dxdy)。最后,有一个参数(size)只传给了实例,在self.__init__的主体中,赋值给self.size

def __init__(self, x, y, size):
    """ Initialize asteroid sprite. """
    super(Asteroid, self)._init_(
        image = Asteroid.images[size],
        x = x,
        y = y,
        dx = (random.choice([1, -1]) * Asteroid.SPEED * random.random()/size),
        dy = (random.choice([1, -1]) * Asteroid.SPEED * random.random()/size))

    self.size = size

重要的是要知道,在Python中,任何方法(在类中定义的例程)都会自动接收第一个参数,这个参数就是对象实例本身。虽然你可以给它起任何名字,但self是Python的通用约定。所以,当你定义__init__并把self作为第一个参数传入时,你可以在这个函数中使用它来引用你正在创建的对象。因此,self.x = x的意思是你希望这个对象有一个x属性,它的值就是你在创建对象时传入的x参数。

撰写回答