2015-12-14 3 views
4

У меня возникли проблемы с выяснением причин, по которым я получаю эту ошибку. Мой код этоимя python namerror не определено

#define the Animal Class 

class Animal: 
    def __init__ (self, animal_type, age, color): 
     self.animal_type = animal_type 
     self.age = age 
     self.color = color 

    def makeNoise(): 
     pass 

    def __str__(self): 
     print ("% is % years old and is %" % animal_type,age, color) 


#define child classes of Animal 
class Wolves(Animal): 
    def __init__(self, animal_type, age, color, wild): 

     Animal.__init__(self, animal_type, age, color) 
     self.wild = wild 
    def __str__(self): 
     print ("% is % years old and is % and is %" % (animal_type, age, color, wild)) 

class Bear(Animal): 
    def __init__ (self, animal_type, age, color, sex): 
     self.sex = sex 
     Animal.__init__(self,animal_type, age, color) 

class Moose(Animal): 
    def __init__(self, animal_type, age, color, antlers): 
     self.antlers = antlers 
     Animal.__init__(self, animal_type, age, color) 

#add items to each class 

wally = Wolves("wolf", 4, "grey","wild") 
sally = Wolves("wolf", 3, "white", "tame") 

print (str(sally)) 
print (str(wally)) 

и полный след-обратно

Traceback (most recent call last): 
    File "//mgroupnet.com/RedirectedFolders/SBT/Documents/bear51.py", line 41, in <module> 
    print (str(sally)) 
    File "//mgroupnet.com/RedirectedFolders/SBT/Documents/bear51.py", line 24, in __str__ 
    print ("% is % years old and is % and is %" % (animal_type, age, color, wild)) 
NameError: name 'animal_type' is not defined 

Что я делаю неправильно?

+6

вы должны называть экземпляр атрибуты с 'я. animal_type, self.age, self.color' –

+1

Когда однозначно, 'this' является необязательным в Java, но' self' в Python нет. –

+0

Я исправил исходную проблему с вашей помощью. спасибо – Swiley

ответ

1

Ох - ну в основном вы только что забыли использовать self.animal_type в своем методе __str__. Как так:

def __str__(self): 
    print ("%s is %s years old and is %s" % self.animal_type,self.age, self.color) 

Так же, как и в __init__, чтобы использовать переменные из вашего конкретизированного класса, вам нужно использовать «я», как в «от этого экземпляра животного, что я работаю на».

0

В методах Python это обычные функции. Поэтому вы не можете получить доступ к локальной переменной из одного метода другим способом. Типичный способ обмена информацией между методами - self. Чтобы получить animal_type в __str__, вам нужно использовать self.animal_type. Специального пространства имен для методов в классе нет. Это означает, что с точки зрения видимости имен не имеет значения, записываете ли вы функции в модуле или методах в классе.

0

В Python self не является ключевым словом, как this в Java. Это просто параметр, как любой другой, который, как правило, обычно называется self.

При вызове метода, как some_animal.__str__() , это на самом деле просто синтаксический сахар для Animal.__str__(some_animal), где some_animal связан с параметром self.

Таким образом, в Java (и во многих других языках) this означает «смотреть на текущий экземпляр этого атрибута» и не является обязательным, если однозначная (то есть, когда нет локальной переменной с тем же именем), но в Python self является не является обязательным. Это обычный параметр метода.


__str__ не является хорошим примером, как вы никогда не называть его таким образом, а str(some_animal), но вы знаете, что я имею в виду

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