Почему я получаю NameError, когда пытаюсь получить доступ к атрибуту в моем классе? - PullRequest
0 голосов
/ 04 июня 2018

У меня есть этот код с классом:

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 ]

0 голосов
/ 04 июня 2018

Эта строка:

return "Perimeter = %s" %(side1 + side2 + side3)

должна быть:

return "Perimeter = %s" %(self.side1 + self.side2 + self.side3)

Чтобы вернуть значение переменных-членов в python, self. должно быть перед элементом.Вот почему self является одним из обязательных параметров для методов-членов.Во многих других языках, таких как C #, подразумевается передача self, поэтому вам не нужно вручную записывать его в код.

0 голосов
/ 04 июня 2018

В отличие от многих других языков, python не разрешает неявный доступ к атрибутам экземпляра.Чтобы получить доступ к атрибуту в python, вы должны явно поставить перед ним префикс self., например:

return "Perimeter = %s" % (self.side1 + self.side2 + self.side3)

Без префикса self. python считает side1 локальной или глобальной переменной.


То же самое относится и к методам.Например, если вы хотите позвонить perimeter из __init__, это не будет работать:

def __init__(self, side1, side2, side3):
    self.side1 = side1
    self.side2 = side2
    self.side3 = side3

    perimeter()

Вместо этого вам придется написать

self.perimeter()

См. Также этот связанный вопрос .

0 голосов
/ 04 июня 2018

Заменить

return "Perimeter = %s" %(side1 + side2 + side3)

На

return "Perimeter = %s" %(self.side1 + self.side2 + self.side3)

Вы пропустили добавление self

...