2016-02-26 73 views
3

我正在編寫Python中的tic-tat-toe的單元測試。當我注意到我的遊戲對象沒有重新實現每種方法時,我一直非常困惑。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!" 

請正確理解我:我來自java並被認爲每種方法都有它自己的堆棧,但我所看到的非常令我驚訝。有人能幫我理解發生了什麼嗎?

+0

你能解釋一下你期待的行爲嗎?這個問題並不清楚。 –

+0

你說得對,但我稱'play = tictactoe.Play()'不等於'java''new SomeObject()'關鍵字語句嗎? –

+0

我可以看到你的測試沒有錯。你確定,'play.check_satisfaction(1,1)'不是*總是*返回'Field has been ...',即使是* new *'Play'?向我們展示'Play .__ init__'和'Play.check_satisfaction'。 – 2016-02-26 14:30:14

回答

4
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

4

您正在聲明您將「遊戲」列爲「靜態」。 表示每個實例將共享相同的列表。在構造函數中移動「遊戲」聲明,然後你應該沒問題。

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 
+0

右:首先必須有**構造函數:)('__init__')。 – BrianO

+2

也許應該爲'more_count'和'finished'完成相同的操作。 –

+0

毫無疑問,是的。所有的時間。 – BrianO