2011-11-09 86 views
15

我有一個描述棋子的類。我爲董事會的所有類型的片斷,例如典當,皇后,敏銳等等... 我在麻煩班級中遇到麻煩我想轉換爲女王或其他有類的對象(當典當轉到第8行時然後轉換爲另一個)我該怎麼做?我可以動態地將一個類的實例轉換爲另一個類的實例嗎?

class Pawn: 
    def __init__(self ,x ,y): 
     self.x = x 
     self.y = y 
    def move(self ,unit=1): 
     if self.y ==7 : 
      self.y += 1 
      what = raw_input("queen/rook/knight/bishop/(Q,R,K,B)?") 
      # There is most be changed that may be convert to: 
      # Queen ,knight ,bishop ,rook 
     if self.y != 2 and unit == 2: 
      print ("not accesible!!") 
     elif self.y ==2 and unit == 2: 
      self.y += 2 
     elif unit == 1: 
      self.y += 1 
     else: 
      print("can`t move over there") 

回答

21

它實際上是可以分配在Python self.__class__,但你必須要知道自己在做什麼。這兩個類必須在某些方面兼容(都是用戶定義的類,既可以是舊式的,也可以是新式的,我不確定使用__slots__)。此外,如果你做pawn.__class__ = Queen,典當對象不會一直由女王構造構成,所以預期實例屬性可能不存在等

另一種方法是一種拷貝構造函數是這樣的:

class ChessPiece(object): 
    @classmethod 
    def from_other_piece(cls, other_piece): 
    return cls(other_piece.x, other_piece.y) 

編輯:又見Assigning to an instance's __class__ attribute in Python

0

在Python的對象永遠是它的類的實例。如果不採取「骯髒的黑客行爲」,無法改變這種情況。

就你而言,你應該考慮重構邏輯。不要讓一塊移動自己,而是定義一些控制器來移動這些塊。如果一個棋子到達最後一排,這個控制器可以很容易地用另一個替換棋子。

0

解決此問題的一種方法是具有通用類Piece類和另一類StrategyCharacteristics類。該作品提供了通用於所有作品的通用界面(如move_to,或其他),Strategy決定是否可行以及如何執行該命令。當你想把一個棋子換成皇后時,你改變了棋子的策略。

編輯:就你而言,甚至可能沒有必要使它變得複雜。你可能有這樣的事情:

class Piece: 
    def __init__(self, movefunc): 
     self.move = movefunc 

def move_pawn(inst, unit=1): 
    pass 

pawn = Piece(move_pawn) 
0

一個解決辦法可能是讓Pawn,通過例如。在Pawn.promote_to('Q')上,返回一個女王,使piece = piece.update()在任何情況下都是明智的。

相關問題