创建一个可以打印角坐标的python Rectangle对象类

时间:2016-04-01 17:33:54

标签: python object position

我是python的新手。我需要创建一个python Rectangle对象类,当被调用时,可以打印角的坐标以及区域和周边。当我尝试运行我的代码时出现问题:

<__main__.Rectangle instance at 0x02F20030>

我被告知要添加__str__但我得到:

TypeError: __str__ returned non-string (type int)

任何帮助将不胜感激,谢谢!

class Rectangle:
    def __init__(self, topLeft, topRight, bottomLeft, bottomRight):
        self.tL = topLeft
        self.tR = topRight
        self.bL = bottomLeft
        self.bR = bottomRight
    def perim(self):
            return (2 * (self.tL + self.tR)) + (2 * (self.bL + self.bR))
    def area(self):
            return (self.tL + self.tR) * (self.bL + self.bR)
    def position(self):
        return self.tL
        return self.tR
        return self.bL
        return self.bR
def __repr__(self):
        return self.tL
        return self.tR
        return self.bL
        return self.bT


r1 = Rectangle (5, 5, 10, 10)
print r1

2 个答案:

答案 0 :(得分:0)

试试这个:

    def __repr__(self):
        return 'tL = '+str(self.tL) + ', tR ='+ str(self.tR)+', bL ='+ str(self.bL) + ', bR =' +str(self.bR)

注释:

  • 只在函数中执行一个return语句,在您的代码中,您的函数只返回self.bT(最后一个)。
  • 在提供的代码def __repr__(self)中没有缩进。
  • 您不需要4个点来定义矩形。
  • 你的Rectangle角不应该只是整数,它们必须是两个坐标(x,y)的序列,例如(3,7)是一个点,将一个点实现为2个整数元组或列表。

编辑: 正如OP所问,以下是如何更改__init__方法以使用笛卡尔坐标:

class Rectangle:
    def __init__(self, tL, bR):  #tL and bR should be passed as tuples
        self.tL = tL
        self.tR = (bR[0], tL[1])  #access tuple elements with tuple[index]
        self.bL = (bR[1], tL[0])
        self.bR = bR

        self.width = bR[0]- tL[0]
        self.height = bR[1] - tL[1]
    def area(self):
        #get area
        #...
    def perim(self):
        #get perim
        #...

r1 = Rectangle((5,5), (30, 20))
print r1.tL   #output (5, 5)
print r1.tR   #output (30, 5)
print r1.width #output 25
print r1.area() #output 375

当然你可以创建一个Point class而不是那个,然后你将两个Point传递给__init__来定义矩形。

我希望能帮到你!

答案 1 :(得分:0)

首先,函数不能有多个return语句。

此外,def __repr__(self):未正确缩进(它属于Rectangle类)。

您可能更愿意__str__而不是__repr__,有关详细信息,请参阅https://docs.python.org/2/reference/datamodel.html#object.repr

class Rectangle:
    def __init__(self, topLeft, topRight, bottomLeft, bottomRight):
        self.tL = topLeft
        self.tR = topRight
        self.bL = bottomLeft
        self.bR = bottomRight
    def perim(self):
        return (2 * (self.tL + self.tR)) + (2 * (self.bL + self.bR))
    def area(self):
        return (self.tL + self.tR) * (self.bL + self.bR)
    def position(self):
        return (self.tL, self.tR, self.bL, self.bR)
    def __str__(self):
        return "Rectangle(%s, %s, %s, %s)" % (self.tL, self.tR, self.bL, self.bR)

r1 = Rectangle (5, 5, 10, 10)
print r1
print "Perimeter: %s" % r1.perim()
print "Area: %s" % r1.area()
print "Position: (%s, %s, %s, %s)" % r1.position()