2016-12-16 11 views
0

Я строй типа (dual numbers) и не может найти способ, чтобы заставить их вести себя хорошо в арифметических выражениях, как комплексные числа в Python сделать:Автоматического преобразования пользователя определить тип в Python

>>> 2 + 3 + 7j 
>>> 5 + 7j 

в моем случае:

>>> 3 + 4 + 5e 
>>> obvious type error 

Я могу легко сделать его работать, управлять __add__method, другой путь:. мой тип + построен в I, также, может сделать это делает внешние функции добавления и передачи параметров, но, очевидно, хорошая интеграция с «+» намного лучше.
Спасибо заранее. PS Где найти исходный код модулей Python (я сам мог бы выглядеть в сложном классе)?

+2

Проверьте ['__radd__'] (https://docs.python.org/3/reference/datamodel.html#object.__radd__) – niemmi

+0

@niemmi: это выглядит хорошо, проверит его. –

+0

@niemmi: это круто, просто проверьте, работает для добавления, с некоторыми трюками для несимметричных операторов тоже! –

ответ

0

Автоматическое преобразование типов в пользовательские типы в Python отсутствует.

Вы должны реализовать методы _add__ и __radd__, __sub__ и __rsub__ и т.д., чтобы эмулировать поведение числовых типов.

См. the Language Reference список магических методов, которые необходимо реализовать.

Вы можете найти исходный код CPython по адресу https://hg.python.org/.

0

Не уверен, что вы можете это сделать. Они называются встроенными типами, и вы не можете их расширять. Тем не менее, вы можете сделать что-то вроде этого:

class ENumber(): 
    def __init__(self, a=0, b=0): 
     self.a = a 
     self.b = b 

    def __repr__(self): 
     return "{} + {}e".format(self.a, self.b) 

    def __add__(self, other): 
     if isinstance(other, ENumber): 
      return ENumber(self.a + other.a, self.b + other.b) 

В действии:

In [15]: x = ENumber(1, 1) 

In [16]: y = ENumber(2, 2) 

In [17]: x+y 
Out[17]: 3 + 3e 

Конечно, Вы должны будете выполнять все другие важные функции тоже.

 Смежные вопросы

  • Нет связанных вопросов^_^