Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中新实例的初始化_Python - Fatal编程技术网

Python中新实例的初始化

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 alrea

我正在用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' 
游戏课程是:

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!"
类播放(对象):
游戏=['-','-','-'],
['-', '-', '-'],
['-', '-', '-']]
移动计数=1
完成=错误
定义(自我):
返回“\n”。加入(地图(str,self.game))
def检查完成(自我):
结果=错误
对于范围(2)中的i:
如果self.game[i][0]==self.game[i][1]==self.game[i][2]!='-':
结果=self.game[i][0]
elif self.game[0][i]==self.game[1][i]==self.game[2][i]!='-':
结果=self.game[i][0]
如果self.game[0][0]==self.game[1][1]==self.game[2][2]!='-':
返回自我。游戏[0][0]
elif self.game[0][2]==self.game[1][1]==self.game[2][0]!='-':
返回自我。游戏[0][2]
elif not any(在self.game中以“-”表示行):
返回“抽签”
其他:
返回结果
def使移动(自身、符号、x、y):
self.game[x][y]=符号
self.move_count+=1
self.finished=self.check_finished()
打印自我
def检查_满意度(自我、x、y):
尝试:
x、 y=int(x),int(y)
除值错误外:
return“请输入整数,再试一次”

如果不是(0您声明您将“游戏”列为“静态”。 这意味着每个实例将共享同一个列表。将“游戏”声明移动到构造函数中,您就可以了

class Play(object):
   def __init__(self):    

        self.game = [['-', '-', '-'],
            ['-', '-', '-'],
            ['-', '-', '-']]
这样做的原因是,当您在类级别声明列表时,当它们生成“类对象”时,将在解析时分配该列表,您可以使用Play.game访问游戏列表。这应该已经让您了解了游戏列表的范围。下面是一个在类级别声明列表的简化示例:

class Play:
    game =[0]


p1 = Play()
print p1.game
p1.game[0] =1
p2 = Play()
print p2.game
确保在类的所有其他方法中始终使用
self.
前缀访问这些成员变量:

  • self.game
  • self.move\u count
  • self.finished

看一看。

你能解释一下你期望的行为吗?这个问题不清楚。你是对的,但我称之为
play=tictactoe.play()
它不等于
java
`newsomeobject()'关键字语句吗?我看不出你的测试有什么问题。你确定吗,
play.check\u满意度(1,1)
并不总是返回
字段已…
,即使是新的
播放
?向我们展示
播放。uuuu init_uuuuuu
播放。检查满足程度
@Rudziankoŭ你能分享你的
播放
代码的相关部分吗?很可能你是在类方法上操作,而不是在实例方法上操作(特别是如果你的背景是java,在java中不需要显式的
self
/
这个
是必需的。正确:首先必须有一个构造函数:)(
\uuu init\uu
)。对于
更多的
完成的
可能也应该这样做。毫无疑问,是的。所有的。另外,请不要调用列表数组。@timgeb,你是对的,我在评论中更改了它
class Play(object):
    def __init__(self):
        self.game = [['-', '-', '-'],
                    ['-', '-', '-'],
                    ['-', '-', '-']]

        self.move_count = 1
        self.finished = False