如何在Board类中基于传入实例创建同类型新构造参数实例
问题解决:棋子类实例创建错误的修复
嘿,我一眼就发现你代码里的问题啦!核心错误出在棋子类的create_another方法里的实例创建逻辑上,咱们一步步来修正:
错误原因分析
你原来的create_another方法里写了:
def create_another(self, team, position): # 返回构造函数 return type(self, team, position)()
这里完全用错了type()的用法:
type(obj)是获取对象obj所属的类,这部分是对的- 但你写成
type(self, team, position),这是type的另一种用法(用来动态创建新类),而不是创建已有类的实例,所以后续加()也没法生成你想要的棋子实例,自然会导致Board类的capturePiece方法失效。
修正后的代码
把棋子类的create_another方法改成下面这样就行:
def create_another(self, team, position): # 先获取当前对象的类,再调用构造函数传入参数创建新实例 return type(self)(team, position)
这样写的逻辑是:
type(self)得到当前棋子实例的类(比如Queen、Rook、King)- 直接调用这个类的构造函数,传入
team和position参数,生成同类型的新棋子实例
验证Board类的方法
修正后,你的Board.capturePiece方法就能正常工作了:
def capturePiece(self, pieceA, pieceB): temp = pieceA pos = pieceB.position self.removePiece(pieceB.position) self.removePiece(pieceA.position) # 现在会正确生成和pieceA同类型的新实例 self.placePiece(pos, temp.create_another(temp.team, pos))
为什么工具类里直接写Queen("Black", pos6)可行?因为那是直接调用类的构造函数,而我们修正后的create_another方法本质上就是动态地做了同样的事情——根据当前实例的类型,调用对应类的构造函数。
内容的提问来源于stack exchange,提问作者Nathaniel Abraham
相关产品推荐
相关产品推荐

