2013-11-01 219 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知道类你的声明是一个具有属性和方法的对象。