Python Newb ie - Почему self._ вызывает ошибку NameE в Python 3 - PullRequest
0 голосов
/ 26 апреля 2020

Я пытаюсь научиться использовать классы в Python, и мне удалось заставить следующий код работать методом проб и ошибок, но я не уверен, как! Кажется, использование «я». иногда требуется, в то время как в других случаях его использование приводит к ошибке. Я был бы очень признателен, если бы кто-то мог объяснить, почему различные строки кода кажутся ведущими себя так по-разному

Если я заменю строку self._tot += _new на self._tot += self._new, тогда я получу следующее ошибка NameError: name 'self' is not defined.

И наоборот, если я заменяю строку self._tot -= self._last на self._tot -= _last, тогда я получаю следующую ошибку NameError: name '_last' is not defined

Код, который ведет себя, по-видимому, противоположным образом: -

class PremiumCounter:   

    def __init__(self, _tot = 0):
        self._tot = _tot        
        self._new = 0
        #self._last = 0

    def add(self, _new = 1):
        self._tot += _new
        self._last = _new

    def undo(self):
        self._tot -= self._last       

    def get_total(self):
        return self._tot

    def clear_counter(self):
        self._tot = 0



ConcertAttendee2 = PremiumCounter(4)#Creates ConcertAttendee2 as an instance of the 'ImprovedCounter' class


ConcertAttendee2.clear_counter()
ConcertAttendee2.add(3)
ConcertAttendee2.add(3)
ConcertAttendee2.undo()
print("Total concert attendees: " + str(ConcertAttendee2.get_total() ))

1 Ответ

1 голос
/ 26 апреля 2020

Как указал @jonrsharpe, в вашем методе undo у вас нет параметра с именем _last, поэтому вы получаете ошибку для self._tot -= _last.

Возможно, вы получите ошибку self._tot += _new with self._tot += self._new , если вы удаляете self из аргумента функции.

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

class PremiumCounter:   

    def __init__(self, tot = 0):
        self._tot = tot        
        self._new = 0
        #self._last = 0

    def add(self, new = 1):
        self._tot += new
        self._last = new

    def undo(self):
        self._tot -= self._last       

    def get_total(self):
        return self._tot

    def clear_counter(self):
        self._tot = 0
...