перегрузка увеличенных арифметических присвоений в Python

Я плохо знаком с Python так извинения заранее, если это - глупый вопрос.

Для присвоения я должен перегрузить увеличенные арифметические присвоения (+ =, - =, / =, * =, ** =, %=) для класса myInt. Я проверил документацию Python, и это - то, что я придумал:

def __iadd__(self, other):

    if isinstance(other, myInt):
        self.a += other.a
    elif type(other) == int:
        self.a += other
    else:
        raise Exception("invalid argument")

self.a и other.a относятся к интервалу, сохраненному в каждом экземпляре класса. Я пытался проверить это следующим образом, но каждый раз я не получаю 'Ни один' вместо математического ожидания 5:

c = myInt(2)
b = myInt(3)
c += b
print c

Кто-либо может сказать мне, почему это происходит?Заранее спасибо.

7
задан Jon Seigel 7 April 2010 в 00:54
поделиться

3 ответа

>>> import string
>>> def int2base(integer, base):
        if not integer: return '0'
        sign = 1 if integer > 0 else -1
        alphanum = string.digits + string.ascii_lowercase
        nums = alphanum[:base]
        res = ''
        integer *= sign
        while integer:
                integer, mod = divmod(integer, base)
                res += nums[mod]
        return ('' if sign == 1 else '-') + res[::-1]


>>> int2base(-15645, 23)
'-16d5'
>>> int2base(213, 21)
'a3'
-121--635516-

Вы можете продолжать использовать < div > , но просто добавить дисплеев: inline в CSS, что сделает его отображаемым как < span > .

Редактирование: фиксированное место в конце, где я сказал «div», но означало «span».

-121--1740797-

Необходимо добавить в метод функцию возврата . Объяснение:

Семантика a + = b , когда тип (a) имеет специальный метод __ iadd __ , определяется как:

  a = a.__iadd__(b)

, так что если __ iadd __ возвращает нечто иное, чем self , то это будет связано с именем a после При отсутствии инструкции return разнесенный метод эквивалентен методу с return None .

14
ответ дан 6 December 2019 в 08:14
поделиться

Расширенные операторы в Python должны возвращать окончательное значение, которое будет присвоено имени, которое они вызывают, обычно (и в вашем случае) self . Как и все методы Python, отсутствие оператора return подразумевает возврат None .

Кроме того,

  • Никогда не поднимайте Исключение , которое невозможно поймать разумно. В коде для этого должно быть указано , кроме Exception , которое перехватит все исключения. В этом случае вам нужна ValueError или TypeError .
  • Не проверяйте тип с помощью type (foo) == SomeType . В этом (и практически во всех) случаях isinstance работает лучше или, по крайней мере, так же.
  • Каждый раз, когда вы создаете свой собственный тип, например myInt , вы должны называть его заглавными буквами, чтобы люди могли распознать его как имя класса.
7
ответ дан 6 December 2019 в 08:14
поделиться

Да, вам нужно "вернуть себя", это будет выглядеть так:

def __iadd__(self, other):
    if isinstance(other, myInt):
        self.a += other.a
        return self
    elif type(other) == int:
        self.a += other
        return self
    else:
        raise Exception("invalid argument")
1
ответ дан 6 December 2019 в 08:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: