我目前正在学习python并尝试实现国际象棋。 (我已经用多种不同的语言完成了此操作)
class Board:
def __init__(self):
self._reset()
def _reset(self, func=Board.default_layout):
self.values = [[0 for x in range(8)] for i in range(8)]
self.currentPlayer = 1
func(self.values)
@staticmethod
def default_layout(values):
pass
if __name__ == "__main__":
b = Board()
重置方法的想法是重置板。上面的零件将被删除,并会调用一个函数,将零件按初始布局放置在板上。
有国际象棋版本,其中有不同的开始布局。因此,我想使用默认方法将其作为可选参数:default_layout(self)
但是此代码无法编译,我想知道问题出在哪里。
我收到错误消息:
NameError: name 'default_layout' is not defined
答案 0 :(得分:2)
您的def _reset(self, func=Board.default_layout):
正在作为Board
定义的一部分进行评估,因此Board.default_layout
尚未定义。
您可以使default_layout
成为普通函数,而不是静态方法。使用前需要先定义它。
def default_layout(values):
... whatever
class Board:
...
def _reset(self, func=default_layout):
...
或者,如果必须是静态方法,请不要尝试在函数声明中引用它。您可以在函数 body 中引用它,因为在实际调用函数之前,body不会执行。
def _reset(self, func=None):
if func is None:
func = Board.default_layout
答案 1 :(得分:1)
作为@khelwood答案的替代方法,如果您希望将lambda
保持为default_layout
类的静态方法,则也可以使用Board
函数。
更改:
def _reset(self, func=Board.default_layout):
到
def _reset(self, func=lambda values: Board.default_layout(values)):