我可以动态地将一个类的实例转换为另一个类吗?

2024-06-16 08:48:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一门描述棋子的课。我为棋盘上所有类型的棋子制作一个类,例如棋子、皇后、基恩等。。。 我在典当类有问题我想转换为皇后或其他有类的对象(当典当转到第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")

Tags: and对象selfmoveifdefunitbe
3条回答

实际上,在Python中可以分配给self.__class__,但是您必须知道自己在做什么。这两个类在某些方面必须兼容(都是用户定义的类,都是旧样式或新样式,我不确定是否使用__slots__)。此外,如果您执行pawn.__class__ = Queen,典当对象将不会由皇后构造函数构造,因此预期的实例属性可能不存在等

另一种方法是像这样的复制构造函数:

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

编辑:另请参见Assigning to an instance's __class__ attribute in Python

解决这个问题的一种方法是有一个泛型的Piece类和另一个StrategyCharacteristics类。这个片段提供了所有片段通用的接口(比如move_to,或者其他什么),并且Strategy决定是否可能以及如何执行命令。当你想把棋子换成皇后时,你就要改变棋子的策略。

编辑:在你的情况下,可能甚至没有必要让事情变得那么复杂。你可以吃这样的东西:

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

def move_pawn(inst, unit=1):
    pass

pawn = Piece(move_pawn)

Python中的对象将始终是其类的实例。如果不诉诸“肮脏的黑客”,就无法改变这种状况。

在您的情况下,您可能应该考虑重构逻辑。不要让一个片段自己移动,而是定义某种移动片段的控制器。如果一个棋子到达最后一行,这个控制器可以很容易地用另一个棋子替换一个棋子。

相关问题 更多 >