[英]Creating a copy of a class with a different constructor
所以我有一個班級女王。 我想將此實例傳遞給一個函數,然后在該函數中我要創建一個皇后(或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)()
對於基類的類方法,這可能是一個很好的例子:
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
但這通常是一個糟糕的設計。 重復銷毀和創建新對象比簡單地更改其屬性要昂貴得多。 而且,無論如何,在真正的棋盤上,您不會創建新的棋子,而不會移動它們,因此您沒有真正的理由不只是實施move方法來更改在棋子基類上的位置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.