Перегрузка __divmod__ метод работает не так, как ожидалось

#python-2.7

#python-2.7

Вопрос:

Я добавил __divmod__ метод в пользовательский класс. Однако, когда я вызываю функцию divmod для экземпляра этого класса, None вместе с кортежем (div, mod) возвращается дополнительный.

Вот минимальный пример:

 class MyClass:
    def __init__(self, val):
        self.val = val
    def __divmod__(self, other):
        return np.divmod(self.val, other)

m = MyClass(7)
 

Вызов divmod(m, 5) дает:

 ((1, 2), None)
 

в то время как я ожидал, что результат будет таким же, как m.__divmod__(5) при прямом вызове:

 (1, 2)
 

Я не понимаю None , откуда берется лишнее. Может быть, у магического метода __divmod__ есть другая цель? Может кто-нибудь привести пример?

Комментарии:

1. мой тест на Python 2 и 3, divmod(m, 5) оба вывода: (1, 2) ?

2. Какую версию Python-2 вы используете? Я тестировал 2.7.13 и 2.7.15 на двух разных компьютерах (оба дистрибутива Anaconda).

3. Я использовал ядро python2 jupyter: 2.7.13, моя обычная среда — python3, это только у меня

4. Спасибо за тестирование. Похоже, что в моей среде python есть конкретная проблема.

5. Хорошо, я нашел решение. Проблема возникла в сеансе IPython, где функция divmod была фактически перезаписана divmod от numpy. Использование функции python divmod дает ожидаемый результат. К сожалению, я не могу ответить на свой собственный вопрос и пометить его как решенный.

Ответ №1:

ученик класса: def init(self,num): self.num=num

 def __divmod__(self,other):
    divmod_tup=divmod(self.num,other.num)
    print("Quotient=",divmod_tup[0])
    print("Remainder=",divmod_tup[1])
 

s1=Студент(66)
s2= Студент (20)
divmod(s1, s2)