Puis-je convertir dynamiquement une instance d'une classe à une autre?
J'ai une classe qui décrivent des pièces d'échecs. Je fais tout type de pièce dans le Conseil de classe par exemple Pion, la Reine, vive, etc...
J'ai un problème dans le gage de la classe je veux convertir à la Reine ou d'un autre objet qui a une classe (quand pion goto 8e ligne, puis de les convertir à quelque chose d'autre) comment puis-je faire cela ?
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")
source d'informationauteur shotgunner
Vous devez vous connecter pour publier un commentaire.
Il est effectivement possible d'assigner à
self.__class__
en Python, mais vous devez vraiment savoir ce que vous faites. Les deux classes doivent être compatibles d'une certaine façon (les deux sont des classes définies par l'utilisateur, les deux sont soit de style ancien ou nouveau style, et je ne suis pas sûr au sujet de l'utilisation de__slots__
). Aussi, si vous nepawn.__class__ = Queen
le pion de l'objet n'aura pas été construit par la Reine constructeur, tant attendu instance attributs risquent de ne pas être là, etc.Une alternative serait une sorte de constructeur de copie comme ceci:
Modifier: Voir aussi L'affectation à une instance de __classe__ attribut en Python
Une façon de résoudre ce problème est d'avoir un générique
Piece
classe et une autreStrategy
ouCharacteristics
classe. La pièce fournit une interface générique, commun à toutes les pièces (commemove_to
ou de quelque chose) etStrategy
décide si c'est possible et comment faire pour exécuter la commande. Lorsque vous souhaitez modifier un pion pour une reine, vous modifiez la stratégie de la pièce.Edit: Dans votre cas, il pourrait même ne pas être nécessaire pour la rendre compliquée. Vous pourriez avoir quelque chose comme ceci:
Une solution pourrait être de laisser
Pawn
par exemple, surPawn.promote_to('Q')
de retour d'une Reine telle quepiece = piece.update()
serait judicieux, en tout cas.Un objet en Python sera toujours une instance de sa classe. Il n'y a aucun moyen de changer cela sans recourir à la "sale hacks".
Dans votre cas, vous devriez probablement envisager de refactoring la logique. Au lieu de laisser un déplacement de la pièce elle-même, de définir un certain type de contrôleur qui déplace les pièces. Si un pion atteint la dernière rangée, ce contrôleur peut facilement remplacer une pièce à l'autre.