2013-10-01 36 views
0

下面的主题已被检查代替我的问题。使用普通测试来检查实例是否存在

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(),除了NameError,isinstance(),甚至vars()[target]都不能解决上面的NameError问题。

我在这里错过了什么,我应该做的就类,即。从另一个类中检查实例时出现异常,语法错误等?如果可能的话,我想远离字典,除非它们是最后的手段,因为从上面的链接中,似乎是唯一的方法。

谢谢!

回答

1

在您的giveAllowance函数被调用之前,会引发NameError。如果你写了类似giveAllowance(10, jane)的东西,变量jane必须存在,作为其他任何事情的先决条件。你不能用一个不存在的变量做任何事情。您不能“暂时”使用它,并在以后检查它是否存在。

为什么你想能够做到这一点?在这种情况下提出错误似乎应该发生。我建议你重新考虑你的设计。即使假设你可以在检查实例是否存在的情况下实现你想要的功能,但是当你尝试给一个不存在的人员提供补贴时,有一个giveAllowance函数只返回一个空字符串并没有多大意义。拥有代表家庭的字典可能更有意义,每个家庭成员的姓名(作为字符串)都有一个密钥。然后,您可以使用if person in familyDict来检查该人是否存在。

顺便说一句,Family可能是不适合你的类一个好名字,因为它并不代表一个家庭,它代表着一个家庭成员

+0

我明白了!所以'jane'基本上在giveAllowance之前进行了检查,这就是为什么NameError是在尽管'正确'检查我一直在申请的情况下发生的。确实,字典似乎是可能的出路。我会把关于'家庭'这个名字的建议放在心上。我会找到更好的方式来改善上面的代码。标记为答案。谢谢! – Manhattan

0

扔掉类,你写道:

x = 28 
print x # prints 28 
print y # throws a name error, complete lack of surprise 

你从未定义jane让翻译告诉你。

你说:

我一直试图找到一种方法来检查,如果家庭的目标实例存在,如果它和正常的字符串,如果它不返回一个价值转移。

你已经走在了自己的前面,不要这么棘手。如果你想jane被实例化,实例化她。

+0

你的例子是一个非常需要的大开眼界。真的,我不应该依赖班里的'内部'。基本上,我想要的是,当现有的家庭实例给予一个不存在的实例的津贴时 - 稍后 - 如果用户想要将这个不存在的目标包括到家庭类中,则向用户呈现选项。事实上,我认为我的方式是错误的。我将修改代码。感谢您的帮助! – Manhattan

相关问题