0

已检查以下主题以代替我在下面的问题。

在 Python 中,如何检查我的类的实例是否存在?

Python 检查类的实例

请耐心等待,因为我是 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。

我是否在这里遗漏了一些我应该在课程方面做的事情,即。检查另一个类中的实例时出现异常,语法错误等?如果可能的话,我想远离字典,除非它们是最后的手段,因为从上面的链接之一看来,这是唯一的方法。

谢谢!

4

2 回答 2

1

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

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

顺便说一句,Family对于你的班级来说,这可能不是一个好名字,因为它不代表一个家庭,它代表一个家庭成员

于 2013-10-01T03:37:45.900 回答
0

扔掉课程,你写道:

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

你从未定义jane,所以口译员告诉你。

你说:

我一直在尝试寻找一种方法来检查 Family 的目标实例是否存在,如果存在则返回值转移,如果不存在则返回普通字符串。

你已经超越了自己,开始时不要那么棘手。如果你想jane被实例化,就实例化她。

于 2013-10-01T03:40:56.423 回答