Как переопределить оператор 1 / x в python - PullRequest
0 голосов
/ 06 июля 2019

Я создаю класс в Python, который я хочу использовать с моими собственными арифметическими алгоритмами.Чтобы работать с его экземплярами, я переопределил все его операторные функции, такие как __add__, __mul__, __truediv__ и т. Д.

Например, скажем, это complex class:

class complex:
    def __init__(self,module,phase):
        self.module = module
        self.phase = phase
    def __mul__(self,other):
        return complex(self.module + other.module, self.phase + other.phase)
    def __truediv__(self,other):
        return complex(self.module / other.module, self.phase - other.phase)

Я хочу иметь возможность записывать выражения как:

from math import pi
a = complex(1,0.5*pi)
b = 1/a

, но если я это сделаю, я получу следующую ошибку:

неподдерживаемый тип операнда (s) for /: 'int' и 'complex'

Хотя я бы хотел получить результат

b = complex(1,0) / a

Что мне нужно переопределить, чтобы он работал?

РЕДАКТИРОВАТЬ:

Благодаря комментарию hiro , я только что открыл для себя новый мир Эмуляция числовых типов

Ответы [ 2 ]

0 голосов
/ 06 июля 2019

Вам необходимо определить __rtruediv__(self,other), которая используется, когда ваш объект находится справа от деления.

и, возможно, также для других операторов:

def __radd__(self, other):       ... 
def __rsub__(self, other):       ...
def __rmul__(self, other):       ...
def __rmatmul__(self, other):    ...
def __rfloordiv__(self, other):  ...
def __rmod__(self, other):       ...
def __rdivmod__(self, other):    ...

Вы можете определить их, используя другие, которые у вас уже есть:

def __rtruediv__(self,other):
    return complex(other,0).__truediv__(self)
0 голосов
/ 06 июля 2019

Почему бы не использовать встроенный тип complex и cmath ?

a = 1+2j
b = 1/a
...