这是我的代码:
class personData ():
def __init__(self, age, spouse = None, children = 0):
self.age = age
self.children = children
self.spouse = spouse
if self.spouse == None:
del self.spouse
print "A %s year old person" % str(self.age)
def marries(self, name):
if self.spouse == None:
self.spouse = name
else:
try:
self.marries(name)
except Exception as detail:
print "spouse exists:", self.spouse
def divorces(self):
if self.spouse == None:
raise AttributeError, " Not married, divorce impossible"
def divorces(self):
if self.spouse != None: ## thats mean the person has a spouse,
self.spouse = None ## I think that should remove the spouse, right?
如果我们再次调用离婚,这应该是例外,因为配偶被移除了。
我们说:
person = personData(30, 'Sue')
person.spouse
将为Sue
,如果我致电person.marries('Anna')
,则会引发异常,现在如果我致电person.divorce()
,则会移除配偶('Sue'
) 。我所坚持的是,当我打电话给person.divorce()
时,它应该提出异常,说“没有配偶存在”而且我无法做到这一点,任何帮助都会受到赞赏。
答案 0 :(得分:2)
您没有直接提出异常,如果提出异常是期望的结果,那么这是合适的。 (或者,您可以只打印一条消息而不处理任何异常。)您无需在此处使用try
- except
。相反,只需提出异常,例如:
if self.spouse == None:
raise Exception( 'Divorce called but no spouse' )
此外,您永远无法访问当前try
部分,因为hasattr(self, 'spouse')
始终为真。另一件事是你的婚姻异常正在发生,因为marries
的无限递归调用,而不是因为直接引发异常。您不应该从marries
内部调用marries
。
答案 1 :(得分:2)
def divorces(self):
if hasattr(self, 'spouse'):
self.spouse = None
这将始终返回True
,spouse
属性可能设置为None
,但它仍然设置。因此永远不会达到打印错误的else
分支。
所以,您需要将其更改为:
if self.spouse == None:
raise Exception('Not married')
在您正在执行的__init__
功能中:
if self.spouse == None:
del self.spouse
我会跳过这个,并将self.spouse
设为None
;这样就不需要getattr()
。
由于您似乎对完整解决方案感到有些困惑,所以这是整个班级:
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()
在marries()
函数中,您正在执行:
try:
marries(self,name)
except Exception as detail:
print "spouse exists:", self.spouse
这是不正确的。这样做,是将类实例marries()
和self
作为参数调用函数name
(不存在)。
您想要做的是:
self.marries(name)
这将调用类实例marries()
上的函数self
。 self
参数由Python自动添加,您无需自己添加它来进行简单的函数调用。
此错误未被注意,因为您正在捕获所有异常。这些“必须抓住它们所有”的口袋妖怪异常几乎总是一个坏主意,因为你不仅捕捉到了你预期的错误,而且捕捉了没有期望的所有错误,例如编程错误。
(我也很困惑为什么你在这里使用递归?)