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

以下主题已被检查,以代替我下面的问题

请容忍我,因为我是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.
问题的关键是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类中,就会向用户提供一个选项。事实上,我认为我的做法是错误的。我将修改代码。也谢谢你的帮助!