Python 用于计算矩形和三角形的面积和周长的类-NameError
我从这个代码中得到一个错误,知道吗?看起来我的测试函数有些问题。我真的不明白。我刚开始使用类,在类中生成测试函数时,是否需要考虑一些重要的事情?如果我不使用Python 用于计算矩形和三角形的面积和周长的类-NameError,python,class,testing,nameerror,Python,Class,Testing,Nameerror,我从这个代码中得到一个错误,知道吗?看起来我的测试函数有些问题。我真的不明白。我刚开始使用类,在类中生成测试函数时,是否需要考虑一些重要的事情?如果我不使用test\u Rectangle和test\u Triangle调用测试函数,代码似乎工作正常。试着在我的书和其他例子中查找,但找不到任何解决此问题的方法 回溯(最近一次呼叫最后一次): 文件“geometric_shapes.py”,第5行,在 类矩形(对象): 文件“geometric_shapes.py”,第31行,矩形 测试_矩形()
test\u Rectangle
和test\u Triangle
调用测试函数,代码似乎工作正常。试着在我的书和其他例子中查找,但找不到任何解决此问题的方法
回溯(最近一次呼叫最后一次):
文件“geometric_shapes.py”,第5行,在
类矩形(对象):
文件“geometric_shapes.py”,第31行,矩形
测试_矩形()
文件“geometric_shapes.py”,第19行,位于测试矩形中
r=矩形(3,4,2,5)
NameError:未定义名称“矩形”
代码:
#练习7.4:为矩形和三角形创建类
从数学导入sqrt
类矩形(对象):
定义初始值(self,x0,y0,w,h):
self.x0=x0
self.y0=y0
self.w=w
self.h=h
def区域(自身):
返回self.h*self.w
def周界(自身):
返回2*self.w+2*self.h
def test_矩形()
r=矩形(3,4,2,5)
w=2;h=5
预期面积=w*h
计算面积=r.面积()
差异=绝对值(预期面积-计算面积)
tol=1E-14
断言diff
正如jonsharpe指出的那样,在矩形
类中定义测试矩形
函数时,缩进是错误的
以下程序将起作用
编辑
以前我认为您已经从代码中提供了一小部分代码,这些代码复制了问题,因此不想对解决方案做太多更改,但现在已经更新了答案
更新
由于测试函数位于类内部,并且由于没有类的实例化,也没有通过这些实例调用测试函数,因此没有调用这些函数
在下面的代码中,我将您自己的函数移到了类定义之外,并显式地调用了它们
from math import sqrt
class Rectangle(object):
def __init__(self, x0, y0, w, h):
self.x0 = x0
self.y0 = y0
self.w = w
self.h = h
def area(self):
return self.h*self.w
def perimeter(self):
return 2*self.w + 2*self.h
class Triangle(object):
def __init__(self, v1, v2, v3):
self.v1 = v1
self.v2 = v2
self.v3 = v3
def area(self):
x1, y1 = self.v1
x2, y2 = self.v2
x3, y3 = self.v3
return 1/2*abs(x2*y3 - x3*y2 - x1*y3 + x3*y1 + x1*y1 - x2*y1)
def perimeter(self):
ver = (self.v1, self.v2, self.v3)
AB = sqrt((ver[1][0] - ver[0][0])**2 + (ver[1][1] - ver[0][1])**2)
BC = sqrt((ver[2][0] - ver[1][0])**2 + (ver[2][1] - ver[1][1])**2)
AC = sqrt((ver[2][0] - ver[0][0])**2 + (ver[2][1] - ver[0][1])**2)
perimeter = AB + BC + AC
return perimeter
def test_Rectangle():
r = Rectangle(3, 4, 2, 5)
w = 2; h = 5
expected_area = w*h
computed_area = r.area()
diff = abs(expected_area - computed_area)
tol = 1E-14
assert diff < tol, "bug in Rectangle.area, diff=%s" % diff
expected_perimeter = 2*w + 2*h
computed_perimeter = r.perimeter()
diff = abs(expected_perimeter - computed_perimeter)
assert diff < tol, "bug in Rectangle.perimeter, diff=%s" % diff
def test_Triangle():
t = Triangle((0,0), (1,0), (0,2))
expected_area = 1
computed_area = t.area()
diff = abs(expected_area - computed_area)
tol = 1E-14
assert diff < tol, "bug in Triangle.area, diff=%s" % diff
expected_perimeter = 5.236
computed_perimeter = t.perimeter()
diff = abs(expected_perimeter - computed_perimeter)
assert diff < tol, "bug in Rectangle.perimeter, diff=%s" % diff
test_Triangle()
test_Rectangle()
从数学导入sqrt
类矩形(对象):
定义初始值(self,x0,y0,w,h):
self.x0=x0
self.y0=y0
self.w=w
self.h=h
def区域(自身):
返回self.h*self.w
def周界(自身):
返回2*self.w+2*self.h
类三角形(对象):
定义初始化(self,v1,v2,v3):
self.v1=v1
self.v2=v2
self.v3=v3
def区域(自身):
x1,y1=self.v1
x2,y2=self.v2
x3,y3=self.v3
返回1/2*abs(x2*y3-x3*y2-x1*y3+x3*y1+x1*y1-x2*y1)
def周界(自身):
版本=(self.v1、self.v2、self.v3)
AB=sqrt((ver[1][0]-ver[0][0])**2+(ver[1][1]-ver[0][1])**2)
BC=sqrt((ver[2][0]-ver[1][0])**2+(ver[2][1]-ver[1][1])**2)
AC=sqrt((ver[2][0]-ver[0][0])**2+(ver[2][1]-ver[0][1])**2)
周长=AB+BC+AC
返回周长
def test_矩形()
r=矩形(3,4,2,5)
w=2;h=5
预期面积=w*h
计算面积=r.面积()
差异=绝对值(预期面积-计算面积)
tol=1E-14
断言diff
看看这些python库来编写测试
请查看您的缩进。您会遇到此错误,因为在类定义中调用
test\u Rectangle
时,Rectangle
显然尚未定义。您所做的与x=x+1
完全相同,之前代码中没有定义x。此外,类不是函数或过程。你不应该在cla期间运行函数
from math import sqrt
class Rectangle(object):
def __init__(self, x0, y0, w, h):
self.x0 = x0
self.y0 = y0
self.w = w
self.h = h
def area(self):
return self.h*self.w
def perimeter(self):
return 2*self.w + 2*self.h
class Triangle(object):
def __init__(self, v1, v2, v3):
self.v1 = v1
self.v2 = v2
self.v3 = v3
def area(self):
x1, y1 = self.v1
x2, y2 = self.v2
x3, y3 = self.v3
return 1/2*abs(x2*y3 - x3*y2 - x1*y3 + x3*y1 + x1*y1 - x2*y1)
def perimeter(self):
ver = (self.v1, self.v2, self.v3)
AB = sqrt((ver[1][0] - ver[0][0])**2 + (ver[1][1] - ver[0][1])**2)
BC = sqrt((ver[2][0] - ver[1][0])**2 + (ver[2][1] - ver[1][1])**2)
AC = sqrt((ver[2][0] - ver[0][0])**2 + (ver[2][1] - ver[0][1])**2)
perimeter = AB + BC + AC
return perimeter
def test_Rectangle():
r = Rectangle(3, 4, 2, 5)
w = 2; h = 5
expected_area = w*h
computed_area = r.area()
diff = abs(expected_area - computed_area)
tol = 1E-14
assert diff < tol, "bug in Rectangle.area, diff=%s" % diff
expected_perimeter = 2*w + 2*h
computed_perimeter = r.perimeter()
diff = abs(expected_perimeter - computed_perimeter)
assert diff < tol, "bug in Rectangle.perimeter, diff=%s" % diff
def test_Triangle():
t = Triangle((0,0), (1,0), (0,2))
expected_area = 1
computed_area = t.area()
diff = abs(expected_area - computed_area)
tol = 1E-14
assert diff < tol, "bug in Triangle.area, diff=%s" % diff
expected_perimeter = 5.236
computed_perimeter = t.perimeter()
diff = abs(expected_perimeter - computed_perimeter)
assert diff < tol, "bug in Rectangle.perimeter, diff=%s" % diff
test_Triangle()
test_Rectangle()