Tak. Musisz tylko upewnić się, że Time.__rtruediv__()
zwraca instancję Frequency
po otrzymaniu float lub liczby całkowitej.
Zastosowanie:
>>> 100/Time(2)
Frequency(50.0)
>>> 2.5/Time(5)
Frequency(0.5)
Realizacja:
class Time:
def __init__(self, value):
self.value = value
def __rtruediv__(self, other):
if not isinstance(other, (int, float)):
return NotImplemented
return Frequency(other/self.value)
class Frequency:
def __init__(self, value):
self.value = value
def __repr__(self):
return '{}({})'.format(self.__class__.__name__, self.value)
Docs Pythona zawiera pełny przykład na implementing the arithmetic operations dla swoich klas niestandardowych.
Właściwym sposobem obsługi niezgodnych typów jest zwrócenie specjalnej wartości NotImplemented
.
NotImplemented
Specjalna wartość, która powinna zostać zwrócona przez binarnych metod specjalnych (np __eq__()
, __lt__()
, __add__()
, __rsub__()
itp) aby wskazać, że operacja nie jest realizowane w stosunku do inny typ:
Załóżmy, że spróbujesz użyć nieobsługiwanego numeru zespolonego, zwrócisz NotImplemented
tak naprawdę powodują TypeError
z poprawnym komunikatem o błędzie. (przynajmniej w pytonie 3)
>>> 100j/Time(2)
Traceback (most recent call last):
File "python", line 1, in <module>
TypeError: unsupported operand type(s) for /: 'complex' and 'Time'
Posiadanie innej klasy dla każdego rodzaju ilości brzmi jak droga do szaleństwa ... W jaki sposób radzisz sobie z niedopasowaniem jednostek? – jpmc26
Używam 'isinstance', a muszę tylko wdrożyć czas i częstotliwość. – Lucidiot