2013-11-01 2 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

Работает как следует. Кроме того: ваш код не вызывает словосочетание(). Вы лжете о том, что делаете, и о своем коде. –

+0

Ваш текущий код выглядит хорошо, попробуйте перезагрузить модуль или удалить файл 'cow.pyc' и повторите попытку. –

+1

Ваша программа неполна, и многие люди догадываются, в чем проблема.Пожалуйста, предоставьте краткую, полную программу, демонстрирующую ошибку. Скопируйте-вставьте (не перепечатывайте) программу и ее вывод и, пожалуйста, сообщите о своем ожидаемом выходе. См. Http://SSCCE.ORG для получения дополнительной информации. –

ответ

0

Я смотрю на проверку имени; для этого объекта требуется аргумент name?

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

Я немного толстый Python, но это выглядит как необходимый аргумент.

1

Я думаю, что вы изменили исходный код и не перегружается модуль:

Buggy версия:

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' 

Теперь давайте изменим источник код и добавить эту строку 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' 

eh! еще такая же ошибка? Это связано с тем, что 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 знает класс ваше объявление является объектом с атрибутами и методами.

Смежные вопросы