将带有“self”的类的实例传递给另一个类,并使用“self”作为

2024-04-26 19:02:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我想把我在代码#1中初始化的snake发送到代码#2中另一个类中的另一个文件,并将它添加到自食蛇列表

代码#1:(蛇类)

def __init__(self, keys, game, pos, color, direction):
    self.keys = keys
    self.game = game
    self.pos = pos
    self.color = color
    self.direction = direction
    game_manager.GameManager.add_snake(self, self)
    self.cells = [pos]
    pass

def get_head(self):
    return cells[len(cells)-1]
    pass

def next_move(self):
    def f(pos, direction):
        return {
            'UP': (pos[0]+1, pos[1]),
            'DOWN': (pos[0]-1, pos[1]),
            'LEFT': (pos[0], pos[1]-1),
            'RIGHT': (pos[0], pos[1]+1)
        }[direction]
    self.pos = f(self.pos, self.direction)
    pass

def handle(self, keys):
    if len(keys) != 0:
        if keys[0] in self.keys:
            direction_key = ''
            for i in keys:
                if keys[i] == self.direction:
                    direction_key = i
            change_dir = keys[0] + direction_key
            not_valid_change = ['ws', 'sw', 'ad', 'da']
            if change_dir not in not_valid_change:
                self.direction = self.keys[keys[0]]
    pass

代码#2:(类游戏管理器)

def __init__(self, size, screen, sx, sy, block_cells):
    self.size = size
    self.screen = screen
    self.sx = sx
    self.sy = sy
    self.block_cells = block_cells
    self.turn = 0
    self.snakes = []
    pass

def add_snake(self, snake):
    self.snakes.append(snake)
    pass

def get_cell(self, pos):
    def in_range(valid, pos):
        if valid > pos and pos >= 0:
            return True
        return False
    return pos if in_range(self.size[0], pos[0]) and in_range(self.size[1], pos[1]) else None

def kill(self, killed_snake):
    self.snakes.remove(killed_snake)
    pass

def handle(self, keys):
    for snake in self.snakes:
        snake(keys)
    for snake in self.snakes:
        snake.next_move()
    self.turn += 1
    pass

我知道在我发送的代码#1(self,self)中,逻辑上在游戏管理器的add#u snake中,“self”将指向snake类实例,而不是游戏管理器。但是自食蛇=[]在GameManager中。你知道吗

我很困惑。错误如下: AttributeError:“Snake”对象没有属性“snakes”


Tags: 代码inposselfgamesizereturnif
1条回答
网友
1楼 · 发布于 2024-04-26 19:02:07

我建议使用一个包含snakes的类变量。然后可以添加到静态方法中。所有GameManager的实例都将具有相同的snake列表

class Snake:
    def __init__(self, keys, game, pos, color, direction):
        self.keys = keys
        self.game = game
        self.pos = pos
        self.color = color
        self.direction = direction
        GameManager.add_snake(self)
        self.cells = [pos]


class GameManager:
    snakes = []

    def __init__(self, size, screen, sx, sy, block_cells):
        self.size = size
        self.screen = screen
        self.sx = sx
        self.sy = sy
        self.block_cells = block_cells
        self.turn = 0
        self.snakes = []

    @staticmethod
    def add_snake(snake):
        GameManager.snakes.append(snake)
        pass


if __name__ == '__main__':
    m = GameManager("m", "m", "m", "m", "m")

    s1 = Snake("s1", "s1", "s1", "s1", "s1")
    s2 = Snake("s1", "s1", "s1", "s1", "s1")

    print(GameManager.snakes)

相关问题 更多 >