以下主题已经过检查,以代替我的问题。
In Python, how do I check if an instance of my class exists?
Python check instances of classes
请耐心等待我,因为我是Python的绝对初学者。我刚刚开始处理课程,我认为一个简单的家庭财务模拟器对我来说是一个很好的起点。以下是我的代码:
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.
问题的关键是giveAllowance()函数。我一直试图找到一种方法来检查Family的目标实例是否存在,如果有,则返回值传递,如果不存在则返回正常字符串。但是,hasattr(),try - 除了NameError,isinstance(),甚至vars()[target]都无法解决上面的NameError。
我在这里错过了一些关于课程应该做的事情,即。从另一个类中检查实例,错误的语法等时出现异常?如果可能的话,我想远离词典,除非它们是最后的手段,因为看起来从上面的一个链接,它是唯一的方法。
谢谢!
答案 0 :(得分:1)
在调用giveAllowance
函数之前引发NameError。如果您编写类似giveAllowance(10, jane)
的内容,则变量jane
必须存在,作为其他任何内容的先决条件。对于不存在的变量,您无法执行任何操作。您不能“暂时”使用它,并在以后查看是否存在。
为什么你希望能够这样做?在这种情况下提出错误似乎应该发生什么。我建议你重新考虑你的设计。即使假设您可以在检查实例是否存在方面达到您想要的效果,但是当您尝试给予允许时,只有一个giveAllowance
函数返回空字符串并没有多大意义。一个不存在的人。拥有一个代表家庭的字典可能更有意义,每个家庭成员的名字都有一个键(作为字符串)。然后,您可以使用if person in familyDict
来检查此人是否存在。
顺便提一下,Family
可能不是您班级的好名字,因为它不代表一个家庭,它代表一个家庭成员。
答案 1 :(得分:0)
扔掉课程,你写道:
x = 28
print x # prints 28
print y # throws a name error, complete lack of surprise
你从未定义jane
,所以翻译告诉你。
你说:
我一直试图找到一种方法来检查Family的目标实例是否存在,如果有,则返回值传递,如果不存在则返回普通字符串。
你已经超越了自己,不要开始这么棘手。如果您希望实例化jane
,请实例化她。