Трассировка стека Python3 "магические функции"
Я нахожусь в ситуации, когда я переопределяю множество так называемых "магических" атрибутов или функций моего класса в Python3 (__add__
, __sub__
, так далее.)
Для всего этого я реализую две одинаковые строки кода:
arg1 = self.decimal if isinstance(self, Roman) else self
arg2 = other.decimal if isinstance(other, Roman) else other
Детали того, что делают эти строки, не важны, однако избыточность в моем коде отвлекает. Есть ли другая "магическая" функция, которая является средним звеном между этим и вызывается в REPL?
Например:
>> Class(9) + Class(3)
... (somewhere in python module)
... def __magicFunction__(self, rhs):
... arg1 = self.decimal if isinstance(self, Roman) else self
... arg2 = other.decimal if isinstance(other, Roman) else other
...
... THEN
...
... def __add__(self, rhs):
... return arg1 + arg2
...
12
с трассировкой стека что-то вроде этого:
Traceback (most recent call last):
File "< stdin>", line 1, in < module>
File "/home/module.py", line 105, in ```__magicFunction__```
File "/home/module.py", line 110, in ```__gt__```
Я надеюсь это имеет смысл...
1 ответ
Я не знаю о другой магической функции, но, вероятно, было бы столь же продуктивно сделать arg1 и arg2 постоянными переменными класса, в котором вы находитесь. Затем создайте метод для класса, который вы вызываете из любой другой магической функции.
РЕДАКТИРОВАТЬ:
на самом деле, почему бы вам просто не использовать getattr? поэтому каждая магическая функция будет выглядеть примерно так:
def __add__(self, rhs):
return getattr(self, 'decimal', self) + getattr(other, 'decimal', other)