<pre><code>def divorces(self):
if hasattr(self, 'spouse'):
self.spouse = None
</code></pre>
<p>这将始终返回<code>True</code>,<code>spouse</code>属性可能被设置为<code>None</code>,但它仍然被设置。所以打印错误的<code>else</code>分支将永远不会到达。你知道吗</p>
<p>所以,你需要把它改成:</p>
<pre><code> if self.spouse == None:
raise Exception('Not married')
</code></pre>
<p>在<code>__init__</code>函数中,您正在执行:</p>
<pre><code> if self.spouse == None:
del self.spouse
</code></pre>
<p>我只想跳过这个,将<code>self.spouse</code>设置为<code>None</code>;这样就不需要<code>getattr()</code>。你知道吗</p>
<h2>示例</h2>
<p>由于您似乎对完整的解决方案有些困惑,下面是整个课程:</p>
<pre><code>class personData ():
def __init__(self, age, spouse = None, children = 0):
self.age = age
self.children = children
self.spouse = spouse
def marries(self, name):
# There is already a spouse, we don't do polygamy
if self.spouse != None:
raise AttributeError("Already married")
# There is no spouse, so we can marry. You may kiss and a all that.
self.spouse = name
def divorces(self):
# There is no spouse, so we can't divorce
if self.spouse == None:
raise AttributeError("Not married, divorce impossible")
# We diverse, and reset the spouse
self.spouse = None
person = personData(30, 'Sue')
person.divorces()
person.marries('Anna')
person.divorces()
# This gives an error
person.divorces()
</code></pre>
<h2>额外小费</h2>
<p>在<code>marries()</code>函数中,您将执行以下操作:</p>
<pre><code>try:
marries(self,name)
except Exception as detail:
print "spouse exists:", self.spouse
</code></pre>
<p>这是不正确的。这样做的目的是调用函数<code>marries()</code>(它不存在),将类实例<code>self</code>和<code>name</code>作为参数。你知道吗</p>
<p>你想做的是:</p>
<pre><code>self.marries(name)
</code></pre>
<p>这将调用类实例<code>self</code>上的函数<code>marries()</code>。<code>self</code>参数是由Python自动添加的,您不需要为简单的函数调用自己添加这个参数。你知道吗</p>
<p>此错误未被注意到,因为您正在捕获所有异常。这些“必须全部捕获”的pokemon异常几乎总是一个坏主意,因为您捕获的不仅仅是您预期的错误,还有所有<em>没有</em>预期的错误,例如编程错误。你知道吗</p>
<p>(我也不明白为什么在这里使用递归?)你知道吗</p>