Python 使用常见的存在性测试检查实例失败
以下主题已被检查,以代替我下面的问题 请容忍我,因为我是Python的绝对初学者。我刚开始攻读课程,我认为一个简单的家庭金融模拟器对我来说是一个很好的起点。下面是我的代码:Python 使用常见的存在性测试检查实例失败,python,class,python-2.7,instance,Python,Class,Python 2.7,Instance,以下主题已被检查,以代替我下面的问题 请容忍我,因为我是Python的绝对初学者。我刚开始攻读课程,我认为一个简单的家庭金融模拟器对我来说是一个很好的起点。下面是我的代码: class Family(object): def __init__(self,name,role,pay,allowance): self.name = name self.role = role self.pay = pay self.allowance = allowance d
class Family(object):
def __init__(self,name,role,pay,allowance):
self.name = name
self.role = role
self.pay = pay
self.allowance = allowance
def describe(self):
print self.name + " is the " + self.role + " of the family. He brings home " + str(self.pay) + " in wages and has a personal allowance of " + str(self.allowance) + "."
class Parent(Family):
def gotRaise(self,percent):
self.pay = self.pay * int(1 + percent)
print self.name + " received a pay increase of " + str((100*percent)) + ("%. His new salary is ") + str(self.pay) + "."
def giveAllowance(self,val,target):
if hasattr(target, Family):
self.pay = self.pay - int(val)
target.pay = target.pay + int(val)
print self.name + " gave " + target.name + " an allowance of " + str(val) + "." + target.name + "'s new allowance is " + str(target.allowance) + "."
else: print ""
class Child(Family):
def stealAllowance(self,val,target):
self.allowance = self.allowance + int(val)
target.allowance = target.allowance - int(val)
def spendAllowance(self,val):
self.allowance = self.allowance - int(val)
monty = Parent("Monty","Dad",28000,2000)
monty.describe() # 'Monty is the Dad of the family. He brings home 28000 in wages and has a personal allowance of 2000.'
monty.giveAllowance(1000,jane) # Produces a "NameError: name 'jane' is not defined" error.
问题的关键是giveAllowment()函数。我一直在试图找到一种方法来检查Family的目标实例是否存在,如果存在,则返回一个值转移,如果不存在,则返回一个普通字符串。但是,hasattr()、try-except-namererror、isinstance()甚至vars()[target]都无法解决上述namererror
我是否遗漏了一些关于类应该做的事情,例如,检查另一个类中的实例时出现异常、语法错误等?如果可能的话,我想远离字典,除非它们是最后的手段,因为从上面的一个链接来看,这似乎是唯一的方法
谢谢 在调用
giveAllowment
函数之前,会引发NameError。如果您编写类似于giveassociation(10,jane)
的代码,那么变量jane
必须存在,作为其他任何操作的先决条件。您不能对不存在的变量执行任何操作。您不能“临时”使用它,稍后再检查它是否存在
你为什么希望能够做到这一点?在这种情况下提出错误似乎是应该发生的事情。我建议你重新考虑你的设计。即使假设您可以通过检查实例是否存在来实现所需的功能,但当您尝试向不存在的人提供津贴时,使用一个只返回空字符串的givefacility
函数也没有多大意义。有一个表示家庭的字典可能更有意义,每个家庭成员的名字都有一个键(作为字符串)。然后,您可以使用if-person-in-familyDict
检查该人是否存在
顺便说一句,
家族
可能不是你的类的好名字,因为它不代表家族,它代表家族成员。扔掉这些类,你写道:
x = 28
print x # prints 28
print y # throws a name error, complete lack of surprise
你从来没有定义过jane,所以翻译告诉你了
你说:
我一直在试图找到一种方法来检查Family的目标实例是否存在,如果存在,则返回一个值转移,如果不存在,则返回一个普通字符串
你已经走在你前面了,开始的时候不要那么狡猾。如果你想实例化jane,就实例化她。我明白了!所以“jane”基本上是在GiveAssociation之前检查的,这就是为什么尽管我一直在应用“正确”的检查方法,但NameError还是被提出的原因。事实上,词典似乎是一种可行的方法。我会牢记关于“姓氏”的建议。我将找到一种方法来改进上面的代码。标记为答案的。谢谢你的例子是一个非常需要的大开眼界的例子。真的,我不应该依赖于班级的“内部”。基本上,我想要的是,当一个现有的Family实例允许一个不存在的实例时——稍后——如果用户希望将这个不存在的目标包含到Family类中,就会向用户提供一个选项。事实上,我认为我的做法是错误的。我将修改代码。也谢谢你的帮助!