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

#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

Что я делаю не так?

4
Swiley 14 Дек 2015 в 19:21

3 ответа

Лучший ответ

Да, ну, в общем, вы просто забыли использовать self.animal_type в своем методе __str__. Вот так:

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

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

1
nuts 14 Дек 2015 в 16:35

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

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

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


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

0
tobias_k 14 Дек 2015 в 16:35

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

0
Mike Müller 14 Дек 2015 в 16:34