python - 在 Python 中初始化新实例

标签 python

我正在 Python 上来回写单元测试。当我注意到我的播放对象并没有在每种方法中重新实例化自己时,我感到非常困惑。

我说的是:

def test_satisfactory_field_occupation(self):
        play = tictactoe.Play()
        play.make_move("+", 1, 1)
        self.assertEqual(play.check_satisfaction(1, 1), "Field has been already occupied, try again")

def test_satisfactory_success(self):
        play = tictactoe.Play()
        self.assertEqual(play.check_satisfaction(1, 1), "Ok") 

我发现了异常:

FAIL: test_satisfactory_success (__main__.TestPlay)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/sergei_rudenkov/PycharmProjects/hello_world/tic-tac-toe/tictactoe_test.py", line 23, in test_satisfactory_success
    self.assertEqual(play.check_satisfaction(1, 1), "Ok")
AssertionError: 'Field has been already occupied, try again' != 'Ok' 

Play 类是:

class Play(object):
    game = [['-', '-', '-'],
            ['-', '-', '-'],
            ['-', '-', '-']]

    move_count = 1
    finished = False

    def __str__(self):
        return "\n".join(map(str, self.game))

    def check_finished(self):
        result = False
        for i in range(2):
            if self.game[i][0] == self.game[i][1] == self.game[i][2] != '-':
                result = self.game[i][0]
            elif self.game[0][i] == self.game[1][i] == self.game[2][i] != '-':
                result = self.game[i][0]
        if self.game[0][0] == self.game[1][1] == self.game[2][2] != '-':
            return self.game[0][0]
        elif self.game[0][2] == self.game[1][1] == self.game[2][0] != '-':
            return self.game[0][2]
        elif not any("-" in row for row in self.game):
            return "Draw"
        else:
            return result

    def make_move(self, sign, x, y):
        self.game[x][y] = sign
        self.move_count += 1
        self.finished = self.check_finished()
        print self

    def check_satisfaction(self, x, y):
        try:
            x, y = int(x), int(y)
        except ValueError:
            return "Please enter integers, try again"
        if not (0 <= x <= 2 and 0 <= y <= 2):
            return "Arguments greater then 2 or less then 0 are not allowed, try again"
        if self.game[x][y] != '-':
            return "Field has been already occupied, try again"
        return "Ok"

    def winner(self):
        if self.finished == '+':
            return "First player (+) has won!"
        elif self.finished == '0':
            return "Second player (0) has won!"
        elif self.finished == 'Draw':
            return "The result is draw!"

请正确理解我的意思:我来自 Java,被认为每个方法都有自己的堆栈,但我所看到的让我非常惊讶。有人可以帮助我了解发生了什么吗?

最佳答案

class Play(object):
    def __init__(self):
        self.game = [['-', '-', '-'],
                    ['-', '-', '-'],
                    ['-', '-', '-']]

        self.move_count = 1
        self.finished = False

确保在该类的所有其他方法中使用 self. 前缀始终访问这些成员变量:

  • self.game
  • self.move_count
  • self.finished

看看 Python tutorial: 9.3.5. Class and Instance Variables .

关于python - 在 Python 中初始化新实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35654173/

相关文章:

python - 在有向图中查找结束节点

python - 将参数作为字符串传递给 zip(),避免使用 exec()

python - 为什么使用 `arg=None` 修复 Python 的可变默认参数问题?

python - 在循环期间将 Jinja2 用于唯一的 div ID?

python - 如何仅在 y 轴 matplotlib 上打开次要刻度

python - 在 Pandas 数据帧 .loc 中使用 Python 的 `in` 运算符

Python 正则表达式 - 在一些值上拆分字符串,但不是全部

python - 将数组从 c 转换为 python ctypes

python - Pandas:根据另一列向后填充缺失值

python - 在 python 中绘制流数据的最轻量级方法