Почему я получаю NameError, когда пытаюсь получить доступ к атрибуту в моем классе?
У меня есть этот код с классом:
class Triangle(object):
def __init__(self, side1, side2, side3):
self.side1 = side1
self.side2 = side2
self.side3 = side3
def perimeter(self):
return "Perimeter = %s" % (side1 + side2 + side3)
a = Triangle(3, 4, 5)
print(a.perimeter())
Запуск этого кода вызывает исключение:
Traceback (most recent call last):
File "untitled.py", line 12, in <module>
print(a.perimeter())
File "untitled.py", line 9, in perimeter
return "Perimeter = %s" % (side1 + side2 + side3)
NameError: name 'side1' is not defined
Почему я не могу получить доступ side1
в perimeter
метод?
3 ответа
Замещать
return "Perimeter = %s" %(side1 + side2 + side3)
к
return "Perimeter = %s" %(self.side1 + self.side2 + self.side3)
Вы пропустили, чтобы добавить self
Эта строка:
return "Perimeter = %s" %(side1 + side2 + side3)
должно быть:
return "Perimeter = %s" %(self.side1 + self.side2 + self.side3)
Чтобы вернуть значение переменных-членов в Python, self.
должен быть перед членом. Вот почему self является одним из обязательных параметров для методов-членов. Во многих других языках, таких как C#, передача self
подразумевается, так что вам не нужно вручную записывать его в код.
В отличие от многих других языков, Python не позволяет неявный доступ к атрибутам экземпляра. Чтобы получить доступ к атрибуту в python, вы должны явно поставить перед ним префикс self.
как это:
return "Perimeter = %s" % (self.side1 + self.side2 + self.side3)
Без self.
префикс, питон считает side1
быть локальной или глобальной переменной.
То же самое относится и к методам. Например, если вы хотите позвонить perimeter
от __init__
, это не будет работать:
def __init__(self, side1, side2, side3):
self.side1 = side1
self.side2 = side2
self.side3 = side3
perimeter()
Вместо этого вам придется написать
self.perimeter()
Смотрите также этот связанный вопрос.