У меня проблемы с выяснением, почему я получаю эту ошибку. Мой код это
#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
Что я делаю не так?
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», как в «из этого экземпляра животного, над которым я работаю».
В 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)
, но вы знаете, что я имею в виду
В Python методы - это просто нормальные функции. Следовательно, вы не можете получить доступ к локальной переменной из одного метода в другом методе. Типичный способ обмена информацией между методами - через self
. Чтобы получить animal_type
в __str__
, вам нужно использовать self.animal_type
. Специального пространства имен для методов в классе не существует. Это означает, что с точки зрения видимости имен не имеет значения, пишете ли вы функции в модуле или методы в классе.
Похожие вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.