当我尝试访问 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。
我有这个代码 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。