Как добавить кролика к числу в Python? - PullRequest
4 голосов
/ 05 мая 2020

Я могу добавить число в класс Rabbit, но не наоборот:

class Rabbit:

    def __init__(self, age):
        self.age = age

    def __add__(self, rabbit):
        if isinstance(rabbit, int):
            return self.age + rabbit
        else:
            return self.age + rabbit.age

print(Rabbit(10) + 5)
print(5 + Rabbit(10))

Последняя строка возвращает:

TypeError: unsupported operand type(s) for +: 'int' and 'Rabbit'

Это потому, что в первом выражении печати (который работает) Rabbit.__add__ вызывается под землей, а во втором выражении вызывается int.__add__, и этот метод int.__add__ не работает с кроликами. Как лучше всего заставить эту работу работать? Я хочу иметь возможность добавлять ints к кроликам и кроликам к int.

1 Ответ

5 голосов
/ 05 мая 2020

Документация о Emulating numeric types и вот что вам нужно:

  • Метод __add__ - это когда левый экземпляр, если из класса, здесь вы обрабатывать правый экземпляр, который может быть из класса или другого

  • Метод __radd__ - это когда правый экземпляр не из класса, а левый, вы здесь

Вам нужно

def __radd__(self, value):
    if isinstance(value, int):
        return self.age + value
    print("Other type", type(value)) # handle non-int as you want

Давать

print(Rabbit(10) + 5)         # add 15
print(Rabbit(10) + Rabbit(5)) # add 15
print(5 + Rabbit(10))         # radd 15
print(5.2 + Rabbit(10))       # radd 'Other type float'
...