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()