2013-10-01 35 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

相關問題