Добавить метод, который работает с точечным объектом или кортежем - PullRequest
0 голосов
/ 07 октября 2011

В одном из моих упражнений написано, что нужно написать add метод для Point, который работает либо с объектом Point, либо с кортежем:

  • Если вторым операндом является точка, метод должен вернуть новую точку, координата х которой является суммой координат х операндов, а также для координат у.
  • Если второй операнд является кортежем, метод должен добавить первый элемент кортежа к координате x, а второй элемент к координате y и вернуть новую точку с результатом.

Это то, как далеко я прошел, и я не уверен, что кортежная часть моего кода является точной. Может кто-нибудь пролить свет на то, как бы я назвал эту программу для кортежа. Я думаю, что я прибил первую часть.

Вот мой код:

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

Это то, что я построил до сих пор, и я не уверен, как на самом деле запустить это с частью кортежа. Я знаю, что если blank + blank1 выполнит часть if, то вызовет функцию add_point, но как мне инициировать кортеж? Я не уверен, правильно ли я написал это ... пожалуйста, помогите.

Ответы [ 2 ]

2 голосов
/ 07 октября 2011

Вы можете просто извлечь свой класс из кортежа (или просто реализовать __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 голос
/ 07 октября 2011

В качестве альтернативы, если вы хотите использовать синтаксис 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
...