2017-04-19 40 views
-1

試圖構建戰艦(拍攝我),我想在我的Board類中的__str__方法打印出一個字符串版本self.board,這是一個列表清單。我在Board類,使self.board成爲一個很好的和漂亮的字符串make_printable()方法。Python:我的__str__方法不打印更新列表

但是,如果在遊戲中更新了self.board的一個實例以反映船舶放置,則__str__不會顯示更新的self.board。任何想法這裏發生了什麼?

class Board: 
    """Docstring for class Board""" 

    def __init__(self): 
     self.board = [[EMPTY] * len(range(BOARD_SIZE)) for number in range(BOARD_SIZE)] 
     self.columns = " " + " ".join([chr(c) for c in range(ord('A'), ord('A') + BOARD_SIZE)]) 
     self.rows = '\n'.join(self.make_printable(self.board)) 

    def make_printable(self, board): 
     myobj = enumerate(self.board, start=1) 
     output = [] 
     for index, value in myobj: 
      output.append(' {:<2} {}'.format(index, ' '.join(value))) 
     return output 

    def __str__(self): 
     return self.columns + '\n' + self.rows 
+3

爲什麼會'__str__'顯示'self.board'如果只使用'self.columns'和'self.rows'?你的'__str__'方法甚至不會使用你的'make_printable'方法 – CoryKramer

+0

歡迎來到StackOverflow。請閱讀並遵守幫助文檔中的發佈準則。 [最小,完整,可驗證的示例](http://stackoverflow.com/help/mcve)適用於此處。在發佈您的MCVE代碼並準確描述問題之前,我們無法爲您提供有效的幫助。您發佈的代碼只是一個類定義,沒有驅動程序來說明問題。 – Prune

+0

不'self.rows'限定如'__init__'包含的'make_printable()'結果? – empathyattack

回答

0

感謝@Delioth和其他人的意見,我的解決方案變得清晰起來。

由於self.rows在一個Board對象實例被創建並永遠不會再更新,這是操作的所有「0'的名單列表變成一個非常漂亮的字符串的結果,顯示同樣的空板時__str__是稍後調用。

由於make_printable()發生在self.board,因爲它是目前(即,也許在遊戲過程中已被更新後),而不是因爲它是在對象實例化,解決的辦法是有__str__()返回make_printable一個電話,但.join() ED以換行,因爲它是在self.rows實現板的所希望的外觀。

那麼,我們開始與此:

class Board: 
"""Docstring for class Board""" 

def __init__(self): 
    self.board = [[EMPTY] * len(range(BOARD_SIZE)) for number in range(BOARD_SIZE)] 
    self.columns = " " + " ".join([chr(c) for c in range(ord('A'), ord('A') + BOARD_SIZE)]) 
    self.rows = '\n'.join(self.make_printable(self.board)) 

def make_printable(self, board): 
    myobj = enumerate(self.board, start=1) 
    output = [] 
    for index, value in myobj: 
     output.append(' {:<2} {}'.format(index, ' '.join(value))) 
    return output 

def __str__(self): 
    return self.columns + '\n' + self.rows 

我們現在有這樣的:

class Board: 
"""Docstring for class Board""" 

def __init__(self): 
    self.board = [[EMPTY] * len(range(BOARD_SIZE)) for number in range(BOARD_SIZE)] 
    self.columns = " " + " ".join([chr(c) for c in range(ord('A'), ord('A') + BOARD_SIZE)]) 

def make_printable(self, board): 
    myobj = enumerate(self.board, start=1) 
    output = [] 
    for index, value in myobj: 
     output.append(' {:<2} {}'.format(index, ' '.join(value))) 
    return output 

def __str__(self): 
    return self.columns + '\n' + ('\n'.join(self.make_printable(self.board))) 

感謝所有誰貢獻您的幫助和耐心。