Ответ 1
Я не являюсь пользователем IPython, поэтому не могу точно сказать, что происходит, но я думаю, что это симптом использования from file2 import *
в вашем файле __init__.py
.
Когда вы создаете экземпляр своего класса Derived
, используя package.Derived
, вы не получаете самую последнюю версию этого класса, а старую версию, которая была текущей, когда пакет был сначала загружен, и from file2 import *
. Когда вы модифицировали код модуля и перезагрузили IPython, это изменило package.file2.Derived
, но не package.Derived
.
Однако старая версия класса по-прежнему имеет ссылку на пространство имен модулей, и когда она пытается найти себя по имени в вызове super
, вместо этого находит более новую версию класса. Вот почему вы получаете ошибку, поскольку два класса Derived
не совпадают.
Вы бы, вероятно, избежали этой проблемы, если бы вы напрямую обращались к package.file2.Derived
. Это всегда приведет вас к текущей версии класса, которая не должна иметь проблем с вызовами super
. Обратите внимание: если все еще есть экземпляры класса, которые были созданы до изменения модуля, у вас могут быть проблемы (но это, вероятно, не очень удивительно).