如何从父类访问子类方法?

时间:2019-04-24 04:32:41

标签: python python-3.x class inheritance

有很多答案说这是不明智的,但是我发现了一种我认为有用的方案。如果我错了,请纠正我,还有更好的方法。

我正在建立一个国际象棋游戏,其中个别棋子继承自超类Chesspiece

class ChessPiece:
    def __init__(self, pos, color, num, piece):
        ...

每件作品都有一个定义可以采取的动作的方法:

class Knight(ChessPiece):
    def __init__(self, pos, color=None, num=''):
        ChessPiece.__init__(self, pos, color, num, self.__class__.__name__)


    def possible_moves(self):
        pos_moves = []

        # Up, Right (1 space, 2 spaces)
        try:
            if 1 <= self.x + 2 <= len(Config.board) and 1 <= self.y - 1 <= len(Config.board):
                if Config.board[self.x + 2][self.y - 1] == '___':
                    pos_moves.append(f'{Config.tile_convert(self.x + 2)}{Config.tile_convert(self.y - 1, True)}')

        except Exception: pass

        #Up, Left
        ...

        return pos_moves

我想实现一个move()函数。 move()函数的代码对于每个棋子都是相同的,不同的是,它必须将建议的棋步与可能的棋子进行比较,因为每个棋子都可能有所不同。我可以为每个代码块创建一个move()函数,但这将重复代码6次。

因此,我想在move()中定义Chesspiece,并引用每个文件的possible_moves()函数。

1 个答案:

答案 0 :(得分:1)

在父级中实现空的possible_moves更简单:

class ChessPiece:
    ...
    def possible_moves(self):
        raise NotImplementedError

    def move(self, pos):
            if pos in self.possible_moves():
            ...

或者甚至在父类中返回一组空的动作:

def possible_moves(self):
    return set()

但是我认为第一个比较好,因此它会强制所有子类实现它以便有用。