dimanche 5 novembre 2017

Python class for calculating area and perimeter of rectangle and triangle. NameError

I get an error from this code, any idea? Looks like there is something with my test functions. I really don't understand this. I just started using classes, is there something important I have to thing about when making test functions within classes? The code seems to work fine if I dont call the test functions with test_Rectangle and test_Triangle. Tried looking in my book and other examples but can't find any solution to this problem.

Traceback (most recent call last):
  File "geometric_shapes.py", line 5, in <module>
    class Rectangle(object):
  File "geometric_shapes.py", line 31, in Rectangle
    test_Rectangle()
  File "geometric_shapes.py", line 19, in test_Rectangle
    r = Rectangle(3, 4, 2, 5)
NameError: name 'Rectangle' is not defined

# Exercise 7.4: Make classes for a rectangle and a triangle

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

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


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

Aucun commentaire:

Enregistrer un commentaire