<p>你的代码真的很难读。你应该把你的问题分解成子问题,并使它们更有逻辑性。在</p>
<p>但是为了直接回答您的问题,在第7行中,您为<code>self.__template</code>分配了一个空模板。在第14行中,将模板转换为字符列表(为什么?毕竟你没有给它写信)并把它赋给<code>self.__template_list</code>。最后,在第21到23行中,您将迭代模板字符列表(仍然是空的),并将其附加到<code>self.__answer</code>,在<code>__str__()</code>中打印。这样你就得到了管道。在</p>
<p>也许我可以给你一些关于如何改进代码的提示:</p>
<ol>
<li><p>网格的文本表示应该与网格的一般概念无关,因此不应该涉及网格类的大多数方法。在您的例子中,它丢弃了<code>__init__()</code>方法,这使您很难理解该方法实际做了什么。您可以对网格执行一些操作,这些操作不需要知道网格最后是如何显示的(如果有的话)。在</p>
<p>输出网格的代码应该完全局限于负责这个的方法,在您的例子中<code>__str__()</code>。</p></li>
<li><p>对于与其他方法或类的用户无关的变量,请使用局部变量而不是成员变量。不必要的成员变量会使代码更难理解、效率更低,并且在调试时会使您感到困惑,例如,在使用<code>dir()</code>检查实例成员时。</p></li>
<li><p>设想一个更符合逻辑地表示网格的数据结构(它只包含必要的数据,而不包含表示的多余细节)。我建议使用列表列表,因为这在python中非常容易操作(例如,您也可以使用二维numpy数组)。</p></li>
</ol>
<p>我建议类似的建议:</p>
<pre><code>class Grid:
'''The grid for the soduku game.'''
def __init__(self, puzzle):
'''Constructs the soduku puzzle from the file.'''
self.grid = []
with open(puzzle, "r") as f:
for line in f:
# strip CR/LF, replace . by space, make a list of chars
self.grid.append([" " if char in " ." else char for char in line.rstrip("\r\n")])
def __str__(self):
'''Prints the soduku puzzle nicely.'''
lines = []
for i, row in enumerate(self.grid):
if i != 0 and i % 3 == 0:
# add a separator every 3 lines
lines.append("+".join(["-" * 3] * 3))
# add a separator every 3 chars
line = "|".join(map("".join, zip(*([iter(row)] * 3))))
lines.append(line)
lines.append("")
return "\n".join(lines)
</code></pre>
<p>注意,这个版本需要一个格式非常严格的文件(没有分隔线或字符,每行的确切字符数)。你可以练习改进它来阅读更自由的格式。在</p>
<p>还要注意,我使用的唯一成员变量是<code>self.grid</code>。所有其他变量都是各自函数的局部变量。在</p>