修改 self 内部函数(8 拼图游戏)是错误的做法吗?
Is it wrong practice to modify self inside functions (8-puzzle game)?
我正在尝试为 8 益智游戏制作自己的解决方案。在网上,我发现大多数解决方案都带有 return 语句。以这种方式编码是错误的做法吗?
import numpy as np
class Game(object):
def __init__(self, n, config):
array = np.array(config)
self.board = array.reshape((n, n))
blank = np.where(self.board == 0)
self.blanky = int(blank[0])
self.blankx = int(blank[1])
self.n = n
def move_up(self):
if self.blanky - 1 < 0:
return None
ay, ax = self.blanky, self.blankx
by, bx = self.blanky - 1, self.blankx
self.board[ay, ax], self.board[by, bx] = self.board[by, bx], self.board[ay, ax]
self.blanky = self.blanky - 1
def move_down(self):
if self.blanky + 1 > n:
return None
ay, ax = self.blanky, self.blankx
by, bx = self.blanky + 1, self.blankx
self.board[ay, ax], self.board[by, bx] = self.board[by, bx], self.board[ay, ax]
self.blanky = self.blanky + 1
def move_left(self):
if self.blankx - 1 < 0:
return None
ay, ax = self.blanky, self.blankx
by, bx = self.blanky, self.blankx - 1
self.board[ay, ax], self.board[by, bx] = self.board[by, bx], self.board[ay, ax]
self.blankx = self.blankx - 1
def move_right(self):
if self.blankx - 1 < 0:
return None
ay, ax = self.blanky, self.blankx
by, bx = self.blanky, self.blankx + 1
self.board[ay, ax], self.board[by, bx] = self.board[by, bx], self.board[ay, ax]
self.blankx = self.blankx + 1
def visualise(self):
return(self.board)
在面向对象编程的世界中,您正在按设计使用 classes。所有实例变量(self.blanky
等)都用于跟踪 class.
的状态
但是,如果您正在考虑其他编码方法,尤其是函数式编码,那么您就有所作为了。在函数式编码中,我们希望避免所有的副作用。他们可以修改函数内的变量和 return 一个值,但不应该修改来自外部世界的任何东西(所以如果你在进行函数式编程,你就不会使用 classes)。有关详细信息,请参阅本文:https://dzone.com/articles/side-effects-1
但是,对于您正在执行的编码类型,class 方法修改 class 的状态没有问题。
我正在尝试为 8 益智游戏制作自己的解决方案。在网上,我发现大多数解决方案都带有 return 语句。以这种方式编码是错误的做法吗?
import numpy as np
class Game(object):
def __init__(self, n, config):
array = np.array(config)
self.board = array.reshape((n, n))
blank = np.where(self.board == 0)
self.blanky = int(blank[0])
self.blankx = int(blank[1])
self.n = n
def move_up(self):
if self.blanky - 1 < 0:
return None
ay, ax = self.blanky, self.blankx
by, bx = self.blanky - 1, self.blankx
self.board[ay, ax], self.board[by, bx] = self.board[by, bx], self.board[ay, ax]
self.blanky = self.blanky - 1
def move_down(self):
if self.blanky + 1 > n:
return None
ay, ax = self.blanky, self.blankx
by, bx = self.blanky + 1, self.blankx
self.board[ay, ax], self.board[by, bx] = self.board[by, bx], self.board[ay, ax]
self.blanky = self.blanky + 1
def move_left(self):
if self.blankx - 1 < 0:
return None
ay, ax = self.blanky, self.blankx
by, bx = self.blanky, self.blankx - 1
self.board[ay, ax], self.board[by, bx] = self.board[by, bx], self.board[ay, ax]
self.blankx = self.blankx - 1
def move_right(self):
if self.blankx - 1 < 0:
return None
ay, ax = self.blanky, self.blankx
by, bx = self.blanky, self.blankx + 1
self.board[ay, ax], self.board[by, bx] = self.board[by, bx], self.board[ay, ax]
self.blankx = self.blankx + 1
def visualise(self):
return(self.board)
在面向对象编程的世界中,您正在按设计使用 classes。所有实例变量(self.blanky
等)都用于跟踪 class.
但是,如果您正在考虑其他编码方法,尤其是函数式编码,那么您就有所作为了。在函数式编码中,我们希望避免所有的副作用。他们可以修改函数内的变量和 return 一个值,但不应该修改来自外部世界的任何东西(所以如果你在进行函数式编程,你就不会使用 classes)。有关详细信息,请参阅本文:https://dzone.com/articles/side-effects-1
但是,对于您正在执行的编码类型,class 方法修改 class 的状态没有问题。