2011-11-09 19 views
15

私はチェスの部分を記述するクラスを持っています。私は、Pawn、Queen、keenなどのクラスのすべてのタイプのボードをボード上に作成します。 Pawnクラスに問題があります。クラスがあるクイーンまたは他のオブジェクトに変換したい(pawn goto第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__に割り当てることが実際に可能ですが、あなたが本当に何をやっている知っている必要があります。 2つのクラスはいくつかの方法で互換性がなければなりません(両方ともユーザー定義のクラスであり、どちらも古いスタイルまたは新しいスタイルです)、__slots__の使用についてはわかりません。また、あなたがpawn.__class__ = Queenをすれば、ポーンオブジェクトは、女王のコンストラクタによって構築されていないので、予想されるインスタンスの属性が存在しないかもしれないなど

代替することは、このようなコピーコンストラクタの一種のようになります。

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

編集:PythonでもAssigning to an instance's __class__ attribute in Python

0

オブジェクトを参照してくださいは、常にそのクラスのインスタンスになります。 「汚れたハック」に頼ることなくそれを変更する方法はありません。

あなたの場合、おそらくロジックのリファクタリングを検討する必要があります。ピースを動かすのではなく、ピースを移動させる何らかの種類のコントローラを定義します。ポーンが最後の行に達すると、このコントローラーはピースを別のピースに簡単に置き換えることができます。

0

これを解決する1つの方法は、汎用のPieceクラスと別のStrategyまたはCharacteristicsクラスを持つことです。このピースは、すべてのピース(例えばmove_toなど)に共通の汎用インターフェイスを提供し、Strategyが可能かどうか、およびコマンドの実行方法を決定します。ポーンをクイーンに変更する場合は、そのピースの戦略を変更します。

編集:あなたのケースでは、それを複雑にする必要さえないかもしれません。一つの解決策は、例えば経て、Pawnを聞かせすることができ

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

def move_pawn(inst, unit=1): 
    pass 

pawn = Piece(move_pawn) 
0

:あなたはこのような何かを持っている可能性がありPawn.promote_to('Q')には、どんな場合でもpiece = piece.update()が賢明であるようにクイーンを返す。

関連する問題