2011-11-09 21 views
15

Satranç taşlarını tanımlayan bir dersim var. Pawn, Queen, keen, vb. Gibi bir sınıfın her tür parçasını yapabilirim. Pawn sınıfında bir sorunum var Kraliçeye veya bir sınıfa sahip olan başka bir nesneyi dönüştürmek istiyorum (piyon 8'inci sırada) sonra başka bir şeye dönüştürün) bunu nasıl yapabilirim?Bir sınıfın bir örneğini bir diğerine dinamik olarak dönüştürebilir miyim?

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

cevap

21

Python ile self.__class__ atamak aslında mümkündür, ancak gerçekten ne yaptığınızı bilmek zorunda. İki sınıfın bazı yollarla uyumlu olması gerekir (her ikisi de kullanıcı tanımlı sınıflar, her ikisi de eski stilde veya yeni stilde, ve ben __slots__ kullanımı hakkında emin değilim).

class ChessPiece(object): 
    @classmethod 
    def from_other_piece(cls, other_piece): 
    return cls(other_piece.x, other_piece.y) 
: Eğer pawn.__class__ = Queen yaparsanız Ayrıca, piyon nesne Kraliçe yapıcısı tarafından inşa edilmiş olmaz, bu nedenle beklenen örneği var vs olmayabilir niteliklerini

alternatif böyle kopya kurucu bir tür olacağını

Düzenleme: her zaman sınıfının bir örneği olur da Assigning to an instance's __class__ attribute in Python

0

Python bir nesne bakınız. Bunu "kirli hack" lere başvurmadan değiştirmenin bir yolu yok. Sizin durumunuzda, mantığı tekrar gözden geçirmeyi düşünmeniz gerekir. Bir parçanın kendini hareket ettirmesine izin vermek yerine parçaları hareket ettiren bir çeşit denetleyici tanımlayın. Bir piyon son satıra ulaşırsa, bu kontrol ünitesi bir parçayı diğeriyle kolayca değiştirebilir.

0

Bunu çözmenin bir yolu, genel Piece sınıfı ve başka bir Strategy veya Characteristics sınıfına sahip olmaktır. Parça, tüm parçalarda ortak olan (move_to veya benzeri) ve Strategy kararlarının mümkün olup olmadığına ve komutun nasıl yürütüleceğine karar verir. Bir piyonu bir kraliçeye değiştirmek istediğinizde, parçanın stratejisini değiştirirsiniz.

Düzenleme: Durumunuzda, bunu karmaşık hale getirmek gerekli olmayabilir. Aracılığıyla örneğin Pawn izin

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

def move_pawn(inst, unit=1): 
    pass 

pawn = Piece(move_pawn) 
0

bir çözüm olabilir: Böyle bir şey olabilir Pawn.promote_to('Q') numaralı telefondan, bir Queen'i, piece = piece.update() her halükarda mantıklı olacak şekilde döndürün.

İlgili konular