python: изменить элементы магических методов, влияющих на операторы [дубликаты]

Я пытаюсь просто для тренировки создать объект python, который может содержать число с произвольными десятичными знаками. Все работает нормально, но у меня проблемы с взаимодействием объекта с математическими операторами. Вот как вы можете воспроизвести ошибку:

class Value():
  def __init__(self,value):
    self.value = value
  def __add__(self,other):
    return self.value + other

x = Value(5)
print(x+2) # this works fine: 7
print(2+x) # this doesn't work: TypeError: unsupported operand type(s) for +: 'int' and 'Value'

то же самое происходит со всеми другими математическими операциями, могу ли я что-то сделать, чтобы избежать этого?


person Giuppox    schedule 04.12.2020    source источник


Ответы (3)


Вы пропустили реализацию __radd__:

class Value():
  def __init__(self,value):
    self.value = value
  def __add__(self,other):
    return self.value + other
  __radd__ = __add__

x = Value(5)
print(x+2)
# 7
print(2+x)
# 7

Подробнее об этом читайте в документации по Python, посвященной эмуляции числовых типов и модуль operator.

person norok2    schedule 04.12.2020
comment
спасибо за ответ, вы знаете, есть ли подобный магический метод для других операторов?... (-,@,*...) - person Giuppox; 04.12.2020
comment
@Giuppox да, смотрите соответствующие ссылки на официальные документы - person norok2; 04.12.2020

Реализуйте __radd__ (или другие __r* методы):

class Value:
    def __init__(self, value):
        self.value = value

    def __add__(self, other):
        return self.value + other

    def __radd__(self, other):
        return self.value + other


x = Value(5)
print(x + 2)
print(2 + x)
person AKX    schedule 04.12.2020

вы должны использовать методы __radd__, __r*__ — это магические методы Python, которые заставляют объект что-то делать, когда он берется из __add__ другого объекта.
Попробуйте что-то вроде этого.

class Value(): 
   def __init__(self,value): 
      self.value = value 
   def __add__(self,other): 
      return self.value + other 
   __radd__ = __add__ 

x = Value(5) 
print(x+1 == 1+x) // True 
person Community    schedule 27.01.2021