Python设置属性时出现AttributeError

Python AttributeError When Attribute is Set

我正在使用 pygame 创建一个蛇形克隆体,但我 运行 遇到了一个奇怪的问题。我有一个名为 snake_tile 的 class,它继承自 pygame 矩形 class,具有一个附加属性,即图块移动的方向:

import pygame

class snake_tile(pygame.Rect):
    def __init__(self, left, top, width, height, direction):
        super().__init__(left, top, width, height)
        self.direction = direction

我在初始化snake_tile对象时传入一个元组作为方向:

snake_head = snake_tile(snake_tile_x, snake_tile_y, 10, 10, (0,0))

这将在我稍后移动图块时用作偏移量,因为 pygame.Rect.move() 函数接受 x 和 y 偏移量:

snake_head = snake_head.move(snake_head.direction[0], snake_head.direction[1])
   

但是,当我尝试像上面那样移动图块时,出现此错误:

AttributeError: 'snake_tile' object has no attribute 'direction'

但是当我尝试这样的事情时:

print(snake_head.direction)
snake_head = snake_head.move(snake_head.direction[0], snake_head.direction[1])

我得到输出:

(0, 0)
AttributeError: 'snake_tile' object has no attribute 'direction'

所以似乎方向属性设置正确,但是当我再次尝试访问是移动蛇头时,我得到一个属性错误。

有什么想法吗?

pygame.Rect.move 不会就地更改矩形对象:它会创建一个新对象和 returns 该新实例。

虽然它在继承方面表现良好:即它 returns 任何子类的新实例,而不是普通的 Rect,它不会在其上设置 .direction 属性.

您的解决方法就像在子类的 .move 方法中设置方向属性一样简单:

class snake_tile(pygame.Rect):
    def __init__(self, left, top, width, height, direction):
        super().__init__(left, top, width, height)
        self.direction = direction

    def move(self, *args, **kw):
        new_instance = super().move(*args, **kw) # we don't care which arguments are passed
        new_instance.direction = self.direction
        return new_instance