我有一门描述棋子的课。我为棋盘上所有类型的棋子制作一个类,例如棋子、皇后、基恩等。。。 我在典当类有问题我想转换为皇后或其他有类的对象(当典当转到第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")
实际上,在Python中可以分配给
self.__class__
,但是您必须知道自己在做什么。这两个类在某些方面必须兼容(都是用户定义的类,都是旧样式或新样式,我不确定是否使用__slots__
)。此外,如果您执行pawn.__class__ = Queen
,典当对象将不会由皇后构造函数构造,因此预期的实例属性可能不存在等另一种方法是像这样的复制构造函数:
编辑:另请参见Assigning to an instance's __class__ attribute in Python
解决这个问题的一种方法是有一个泛型的
Piece
类和另一个Strategy
或Characteristics
类。这个片段提供了所有片段通用的接口(比如move_to
,或者其他什么),并且Strategy
决定是否可能以及如何执行命令。当你想把棋子换成皇后时,你就要改变棋子的策略。编辑:在你的情况下,可能甚至没有必要让事情变得那么复杂。你可以吃这样的东西:
Python中的对象将始终是其类的实例。如果不诉诸“肮脏的黑客”,就无法改变这种状况。
在您的情况下,您可能应该考虑重构逻辑。不要让一个片段自己移动,而是定义某种移动片段的控制器。如果一个棋子到达最后一行,这个控制器可以很容易地用另一个棋子替换一个棋子。
相关问题 更多 >
编程相关推荐