添加适用于Point Object或元组的方法

时间:2011-10-07 10:26:38

标签: python add overloading

我的一个练习说是为Point使用Point对象或元组编写一个 add 方法:

  • 如果第二个操作数是Point,则该方法应该返回一个新的Point,其x坐标是操作数的x坐标的总和,同样也是y坐标的总和。
  • 如果第二个操作数是元组,则该方法应将元组的第一个元素添加到x坐标,将第二个元素添加到y坐标,并返回带有结果的新Point。

这到底有多远,我不确定我的代码的元组部分是否准确。有人可以说明如何将这个程序称为元组部分。我想我已经钉了第一部分。

这是我的代码:

Class Point():
    def__add__(self,other):
            if isinstance(other,Point):
                    return self.add_point(other)
            else:
                    return self.print_point(other)

    def add_point(self,other):
            totalx = self.x + other.x
            totaly = self.y + other.y
            total = ('%d, %d') % (totalx, totaly)
            return total

    def print_point(self):
            print ('%d, %d) % (self.x, self.y)

    blank = Point()
    blank.x = 3
    blank.y = 5
    blank1 = Point()
    blank1.x = 5
    blank1.y = 6

这就是我到目前为止所构建的内容,我不知道如何使用元组部分实际运行它。我知道if blank + blank1 if部分是否会运行并调用add_point函数但是如何启动元组。我不确定我是否正确写了这个...请帮助。

2 个答案:

答案 0 :(得分:2)

您可以从元组中简单地派生您的类(或只是实现__getitem__)。

class Point(tuple):
    def __new__(cls, x, y):
        return tuple.__new__(cls, (x, y))

    def __add__(self, other):
        return Point(self[0] + other[0], self[1] + other[1])

    def __repr__(self):
        return 'Point({0}, {1})'.format(self[0], self[1])

p = Point(1, 1)
print p + Point(5, 5) # Point(6, 6)
print p + (5, 5)      # Point(6, 6)

答案 1 :(得分:1)

或者,如果您希望能够使用point.x和point.y语法,则可以实现以下内容:

class Point():
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __add__(self, other): 
        if isinstance(other, Point):
            return Point(self.x + other.x, self.y + other.y)
        elif isinstance(other, tuple):
            return Point(self.x + other[0], self.y + other[1])
        else:
            raise TypeError("unsupported operand type(s) for +: 'Point' and '{0}'".format(type(other)))

    def __repr__(self):
        return u'Point ({0}, {1})'.format(self.x, self.y) #Remove the u if you're using Python 3