Python 新手 - 为什么 self._ 在 Python 中导致 NameError 3

Python Newbie - Why does self._ causing a NameError in Python 3

我正在尝试学习如何在 Python 中使用 类 并通过反复试验设法使以下代码正常工作,但我不确定如何使用!似乎有时需要使用 'self.' 而在其他时候它的使用会产生错误。如果有人能解释为什么不同的代码行似乎表现如此不同

,我将不胜感激

如果我用 self._tot += self._new 替换行 self._tot += _new 然后我得到以下错误 NameError: name 'self' is not defined.

相反,如果我用 self._tot -= _last 替换行 self._tot -= self._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() ))

正如@jonrsharpe 指出的那样,在您的 undo 方法中,您没有名为 _last 的参数,因此您收到 self._tot -= _last.

的错误

如果从函数参数中删除 self,您可能会收到错误 self._tot += _new with self._tot += self._new

此外,python 约定:对 class 属性使用下划线,而不是参数。下面的代码在命名约定方面更好。

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