Python prompt TypeError: super (type, obj): obj трябва да бъде екземпляр или подтип на тип

Python Prompt Typeerror



Python prompt TypeError: super (type, obj): obj трябва да бъде екземпляр или подтип на тип

  1. Опишете накратко проблема

Един ден на работа кода на python, който работи нормално при отстраняване на грешки, се компилира и изпълнява, но извежда изключение, подканвайки 'TypeError: super (type, obj): obj трябва да бъде екземпляр или подтип на тип'. Причината за този проблем е, че типовете type и obj са несъвместими (т.е. обектът obj не е създаден от клас от тип тип), но работи при отстраняване на грешки. Изведнъж си помислих дали това се дължи на използването на модула pyd след компилация и имаше проблем при зареждането на модула.



За да се открие причината за грешката, тестовият код беше конструиран и процесът на грешката беше повторен. Модулът е импортиран многократно. За модула pyd, името на модула трябва да се използва, когато се използва api load_module, в противен случай импортирането ще се провали, но понякога името трябва да бъде променено, тъй като в директорията може да има модули със същото име, но различни функции, ако не променяте модула, импортиран, след като името ще замени предварително импортирания модул, вижте Фигура 1.1 тестов код.



Проблемът сега е да промените името, но е установено, че все още може да има проблем с презаписване на импортирането. След втория импорт, първият успешно създаден обект ще изхвърли „TypeError: super (type, obj): obj трябва да бъде екземпляр или подтипът на типа е ненормален, както е показано на фигура 1.1 тестов код.



Фиг 1.1 Тестов код

  1. причини за проблем

1. Може да се задейства след импортиране на „а“ (тъй като името е същото като а). Операцията за презареждане модифицира обектния модул. Поради съществуването на препратка (може да е частично невидима структура на данни), тя също засяга 'a1' част от данните вътре в обекта на модула? Това води до странни аномалии.



2. Може да се задейства след импортиране на „а“ (тъй като името е същото като а). Операцията за презареждане модифицира обект на модул, което кара интерпретатора на pyhton да интерпретира модулите a и a1 според модула след презареждане. .

Просто проверете горното твърдение. Създайте нова папка с име a и b в главната директория на проекта и поставете модула a.pyd. Тестовият код в модула е показан на фигура 2.1. Тази програма греши, когато достигне 16 реда. Това показва, че типът на текущия обект е несъвместим с типа на класа (показва, че текущият обект не е екземпляр на този клас). Разбира се, тази грешка възниква след многократно импортиране на модул. Преди да извикаме метода get, нямаше изключение, както е показано на фигура 2.2.

Фиг 2.1 Изходен файл на модул a.pyd

Фиг 2.2 Тестов код 1

Следващият тест е да се създадат b_obj обекти чрез клас a1_module.B и re_b_obj обекти чрез клас re_a_module.B и да се отпечатат вътрешно идентификаторите, за да се покаже, че техните идентификатори са еднакви. Всички те са 76028552, което е идентификаторът на re_a_module.B, показващ python Когато интерпретаторът интерпретира вътрешно, той също интерпретира първия импортиран клас като по-късно претоварен клас, което води до TypeError при създаване на инстанция на super. В обобщение, предположение 2 е валидно, вижте Фигура 2.3.

Фиг 2.3 Тестов код 2

  1. Решение
    1. Симулационен случай

След анализ мисля, че докато модулът не бъде презареден, проблемът може да бъде избегнат, така че след първото импортиране на модула, модулът 'a' се изскача от речника на системния модул и експортираният модул се актуализира до sys с ключа на 'a1'. Модулите могат да решат горните проблеми. Пример: sys.modules.update ({'a1': sys.modules.pop ('a')}) вижте фигура 3.1.

Фиг 3.1 Решение на симулационен случай