当我尝试访问 class 中的属性时,为什么会出现 NameError?

Why am I getting a NameError when I try to access an attribute in my class?

我有这个代码 class:

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

为什么我无法在 perimeter 方法中访问 side1

替换

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)

到return成员变量的值在python,self.必须在成员之前。这就是为什么 self 是成员方法的必需参数之一。在 C# 等许多其他语言中,self 的传递是隐含的,因此您不必手动将其写入代码。

与许多其他语言不同,python 不允许隐式访问实例属性。要访问 python 中的属性,您必须明确地在其前面加上 self. 前缀,如下所示:

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

没有 self. 前缀,python 认为 side1 是局部或全局变量。


同样的事情也适用于方法。例如,如果您想从 __init__ 调用 perimeter,这将不起作用:

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

    perimeter()

相反,您必须编写

self.perimeter()

另见 this related question