<p>首先修复<code>City</code>类(注意:假设python 2.x-不需要从python 3.x中的<code>object</code>继承)</p>
<pre><code>class City(object):
def __init__(self):
self.coordinates = set()
def gift(self, x, y):
self.coordinates.add((x, y))
def was_gifted(self, x, y):
return (x, y) in self.coordinates
def all_gifted(self):
return self.coordinates
</code></pre>
<p>在我看来,<code>Santa</code>类的规范非常清楚。您的类将需要一个<code>city</code>(实例<code>City</code>)和<code>coords</code>实例属性,第一个作为参数传递,第二个默认为<code>(0, 0)</code>。你知道吗</p>
<p><code>move(self, c)</code>方法将根据字符<code>c</code>的值更新<code>self.coords</code>,即假定<code>(0, 0)</code>为当前坐标,<code>santa.move('^')</code>应该将<code>self.coords</code>更新为<code>(0, 1)</code>,-而<code>moves(self, moves)</code>方法只是迭代<code>moves</code>并为<code>moves</code>中的每个字符调用<code>self.move(c)</code>。你知道吗</p>
<p><code>gift(self)</code>方法仅使用当前坐标调用<code>self.city.gift()</code>(实际上是一个单行程序)。你知道吗</p>
<p>请注意,<code>FastSanta</code>,一旦<code>Santa</code>工作,只需覆盖<code>move()</code>,这样坐标就会被多个单位更新。。。你知道吗</p>
<p>我从<code>Santa</code>的初始值设定项开始,然后您应该能够尝试并实现其他方法—如果您有问题,可以发布一个更集中的问题:</p>
<pre><code>class Santa(object):
def __init__(self, city):
self.city = city
self.coords = (0, 0)
</code></pre>
<p>编辑:修复更新的操作码:</p>
<pre><code>class Santa(City):
</code></pre>
<p>为什么要把它变成<code>City</code>的子类???圣诞老人是一座城市吗???显然不是。。。你想要<code>class Santa(object):</code>(python2.x)或者仅仅<code>class Santa:</code>(python3.x)</p>
<pre><code> def __init__(self, City):
self.city = City
</code></pre>
<p>命名约定:类使用<code>CapNames</code>,实例使用<code>all_lower</code>。这里,第二个参数应该是<code>City</code><em>实例</em>,因此应该是:</p>
<pre><code> def __init__(self, city):
self.city = city
</code></pre>
<p>(剪)</p>
<pre><code> def gift(self):
self.city.gift
</code></pre>
<p>这将在<code>self.city</code>上查找名称“gift”,这将产生一个<code>method</code>对象,丢弃方法对象,并返回<code>None</code>。这里需要调用城市的<code>gift</code>方法,传递所需的<code>x</code>和<code>y</code>参数。你知道吗</p>
<p>要回答您的其他问题(在代码或下面的注释中):</p>
<p><code>(x, y) in self.coordinates</code>是一个布尔表达式,在执行<code>return</code>语句之前,它将被求值(替换为有效值)。所以呢
返回</p>
<p>功能与</p>
<pre><code> if <some-boolean-expression>:
return True
else:
return False
</code></pre>
<p>但以一种不那么冗长的方式。你知道吗</p>
<p>wrt/<code>FastSanta</code>实际上非常简单,您只需将<code>Santa.move()</code>中使用的默认“移动”值<code>1</code>替换为传递给<code>FastSanta</code>的构造函数的值。你知道吗</p>
<p>最后一点:提供给您的单元测试不仅仅是验证代码的一种方法,它们还为您提供了许多有关预期行为甚至实现的线索,甚至让您测试不同的实现(比如<code>was_gifted()</code>的详细和非详细实现),并自己找出它们是否产生同样的结果。你知道吗</p>