创建具有不同结构的类的副本

2024-06-16 08:58:11 发布

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

所以我有一个班级皇后。我想将这个实例传递到一个函数中,并在该函数中创建一个Queen(或Rook或King)的新实例(根据传入的类可以是Rook、King等),但初始输入参数不同。我希望这很简单

我可以从一个实用程序类中完成这项工作,但我需要Board类中的功能。你知道吗

# This part works if I do it in the utility class

board.removePiece(pos6)
board.removePiece(pos2)
board.placePiece(pos6, Queen("Black", pos6))

# This part doesnt work

def capturePiece(self, pieceA, pieceB):
    temp = pieceA
    pos = pieceB.position

    self.removePiece(pieceB.position)
    self.removePiece(pieceA.position)

    self.placePiece(pos, temp.create_another(temp.team, pos))

# From the Queen, King, etc, class

def create_another(self, team, position): # Returning constructor
    return type(self, team, position)()

Tags: 实例函数posselfboardpositiontempteam
1条回答
网友
1楼 · 发布于 2024-06-16 08:58:11

对于基类上的类方法来说,这可能是一个很好的例子:

class Piece:
    @classmethod
    def create_another(cls, team, position):
        return cls(team, position)
    def __init__(self, team, position):
        self.team = team
        self.position = position
    def __str__(self):
        return str("{} team {} at {}".format(self.__class__,
                             self.team, self.position))

class Queen(Piece):
    pass

class Rook(Piece):
    pass

class Board:
    def placePiece(self, pos, piece):
        print("Place {} at {}".format(piece, pos))
    def removePiece(self, position):
        print("Remove piece at " + str(position))
    def capturePiece(self, pieceA, pieceB):
        temp = pieceA
        pos = pieceB.position

        self.removePiece(pieceB.position)
        self.removePiece(pieceA.position)

        self.placePiece(pos, temp.create_another(temp.team, pos))
    def test(self):
        r = Rook("White", "d4")
        q = Queen("Black", "d6")
        self.capturePiece(q, r)

您可以尝试:

b = Board()
b.test()

按预期显示:

Remove piece at d4
Remove piece at d6
Place <class '__main__.Queen'> team Black at d4 at d4

但这通常是一个糟糕的设计。重复地销毁和创建新对象比简单地更改它们的属性要昂贵得多。无论如何,在一个real棋盘上,你不会创建新的棋子,而是移动它们,因此你没有真正的理由不实现一个move方法来改变棋子基类上的位置。你知道吗

相关问题 更多 >