2016-07-21 1 views
1

я определил новый класс модуль 7:Может ли дополнение между классами оцениваться классом второго аргумента?

class mod7: 

    def __init__(self, n): 
     self.val = n % 7 

    def __repr__(self): 
     return str(self.val) 

Тогда

In [2]: a = mod7(18) 

In [3]: a 
Out[3]: 4 

Я хотел, чтобы добавки не только mod7 объектов, но и целых к новому классу. Так что под классом я добавил

def __add__(self, other): 
     if type(other) is int: 
      return mod7(self.val + other) 
     if type(other) is mod7: 
      return mod7(self.val + other.val) 

и

In [11]: a + mod7(5) 
Out[11]: 2 

In [12]: a + 5 
Out[12]: 2 

Однако

In [13]: 5 + a 
Traceback (most recent call last): 

    File "<ipython-input-13-14fd8adcbf4d>", line 1, in <module> 
    5+a 

TypeError: unsupported operand type(s) for +: 'int' and 'mod7' 

Я понимаю, почему - Функция добавления называется классом 1-го аргумента. Мой вопрос: есть ли способ переопределить 5 + a в соответствии с классом 2-го аргумента, то есть a?

+0

Вы можете добавить метод '__radd__' в свой класс. Однако следует отметить, что обычно модуль обычно определяется оператором. В противном случае, должен ли результат иметь модуль первого или второго аргумента? –

+0

@JaredGoguen - Можете ли вы объяснить, что вы подразумеваете под «определением модуля на операторе»? Может ли он быть реализован в классе? – Aguy

+0

Что такое (5% 7) + (7% 8)? Уравнение типа 5 (+% 4) 6 = 11% 4 = 3 имеет больше смысла. –

ответ

2

Вы также хотите определить __radd__. Это будет вызываться автоматически , если левый операнд не поддерживает +, но ints do, поэтому вам нужно определить его специально для обработки этой ситуации. Вы можете просто определить его, чтобы вызвать функцию __add__, чтобы вам не пришлось переписывать что-либо.