2013-11-01 210 views
-4

我有一個簡單的程序python問題。該程序應該允許用戶創建一個Cow()實例,並在該參數中爲該牛命名。屬性錯誤Python

class Cow(): 
    def __init__(self, name): 
     self.name = name 
     if self.name == None: 
      raise NoNameCowError("Your cow must have a name") 


    def speak(self): 
     print self.name, "says moo" 

現在,當我做

cow.Cow("Toby") 

我得到的錯誤

Traceback (most recent call last): 
    File "<pyshell#32>", line 1, in <module> 
    cow.Cow("Toby") 
    File "C:\Users\Samga_000\Documents\MyPrograms\cow.py", line 8, in __init__ 
    self.name = name 
AttributeError: Cow instance has no attribute 'name' 

幫助?我原本以爲我在例外方面做了一些錯誤,但似乎並非如此。提前致謝。

+1

正常工作。除此之外:你的代碼不會觸發speak()。你在說你在做什麼和你的代碼。 –

+0

您目前的代碼看起來不錯,請嘗試重新加載模塊或刪除'cow.pyc'文件並重試。 –

+1

你的程序不完整,導致許多人猜測問題出在哪裏。請提供一個簡短的完整程序來說明錯誤。請複製粘貼(不要重新輸入)程序及其輸出,並請描述您的預期輸出。有關更多信息,請參閱http://SSCCE.ORG。 –

回答

0

我在盯着名稱檢查;這個對象需要名稱參數嗎?

if self.name == None: 
     raise NoNameCowError("Your cow must have a name") 

我是一個小厚的Python,但看起來像所需的參數。

1

我想你修改你的源代碼,並沒有重新加載的模塊:

巴吉版本:

class Cow(): 
    def __init__(self, name): 
     if self.name == None: 
      raise NoNameCowError("Your cow must have a name") 
    def speak(self): 
     print self.name, "says moo" 

>>> import so 

錯誤預期上調:

>>> so.Cow('abc1') 
Traceback (most recent call last): 
    File "<ipython-input-4-80383f90b571>", line 1, in <module> 
    so.Cow('abc1') 
    File "so.py", line 3, in __init__ 
    if self.name == None: 
AttributeError: Cow instance has no attribute 'name' 

現在讓我們修改源code and add this line self.name = name

>>> import so 
>>> so.Cow('abc1') 
Traceback (most recent call last): 
    File "<ipython-input-6-80383f90b571>", line 1, in <module> 
    so.Cow('abc1') 
    File "so.py", line 3, in __init__ 
    self.name = name 
AttributeError: Cow instance has no attribute 'name' 

呃!還是同樣的錯誤?這是因爲python仍在使用舊的.pyc文件或緩存的模塊對象。只需重新加載模塊和更新的代碼工作正常:

>>> reload(so) 
<module 'so' from 'so.py'> 
>>> so.Cow('dsfds') 
<so.Cow instance at 0x8b78e8c> 

docs

注爲了提高效率,每個模塊僅每 解釋器會話中導入一次。因此,如果您更換模塊,則必須重新啓動解釋器 - 或者,如果它只是一個模塊,您希望以交互方式測試 ,請使用reload()(例如, reload(modulename)


一個更好版本的代碼:

class Cow(): 
    def __init__(self, name=None): #Use a default value 
     self.name = name 
     if self.name is None:  #use `is` for testing against `None` 
      raise NoNameCowError("Your cow must have a name") 
0

當你的聲明牛,你需要傳遞對象括號:

class Cow(object): 
    rest of code. 

這樣Python知道類你的聲明是一個具有屬性和方法的對象。