2011-11-09 34 views
15

Tôi có một lớp mô tả quân cờ. Tôi làm cho tất cả các loại mảnh trong bảng một lớp ví dụ cầm đồ, nữ hoàng, quan tâm, vv ... Tôi gặp rắc rối trong lớp Cầm đồ Tôi muốn chuyển đổi thành Nữ hoàng hoặc đối tượng khác có lớp sau đó chuyển đổi sang cái gì đó khác) làm thế nào tôi có thể làm điều này?Tôi có thể tự động chuyển đổi một thể hiện của một lớp này sang một lớp khác không?

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") 

Trả lời

21

Thực tế bạn có thể gán cho self.__class__ bằng Python, nhưng bạn thực sự phải biết mình đang làm gì. Hai lớp phải tương thích theo một số cách (cả hai đều là lớp do người dùng định nghĩa, cả hai đều là kiểu cũ hoặc kiểu mới và tôi không chắc chắn về việc sử dụng __slots__). Ngoài ra, nếu bạn làm pawn.__class__ = Queen, đối tượng cầm đồ sẽ không được xây dựng bởi các nhà xây dựng Queen, ví dụ để dự kiến ​​các thuộc tính có thể không có mặt ở đó, vv

Một thay thế sẽ là một loại constructor sao chép như thế này:

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

Sửa: Xem thêm Assigning to an instance's __class__ attribute in Python

0

một đối tượng trong Python sẽ luôn là một thể hiện của các lớp học. Không có cách nào để thay đổi điều đó mà không cần phải dùng đến "hacks bẩn".

Trong trường hợp của bạn, có lẽ bạn nên xem xét sắp xếp lại logic. Thay vì để cho một mảnh di chuyển chính nó, xác định một số loại điều khiển di chuyển các mảnh. Nếu một cầm đồ đến hàng cuối cùng, bộ điều khiển này có thể dễ dàng thay thế một mảnh bằng một cái khác.

0

Một cách để giải quyết vấn đề này là có một lớp học chung là Piece và một lớp học khác là Strategy hoặc Characteristics. Các mảnh cung cấp chung chung giao diện chung cho tất cả các mảnh (như move_to, hoặc một cái gì đó) và Strategy quyết định nếu nó có thể và làm thế nào để thực hiện lệnh. Khi bạn muốn thay đổi một con tốt cho một nữ hoàng, bạn thay đổi chiến lược của mảnh.

Chỉnh sửa: Trong trường hợp của bạn, có thể thậm chí không cần thiết phải làm cho nó phức tạp. Bạn có thể có một cái gì đó như thế này:

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

def move_pawn(inst, unit=1): 
    pass 

pawn = Piece(move_pawn) 
0

Một giải pháp có thể để cho Pawn, thông qua ví dụ: trên Pawn.promote_to('Q'), trả lại một Nữ hoàng sao cho piece = piece.update() sẽ hợp lý trong mọi trường hợp.

Các vấn đề liên quan