isinstance поведение с перезагрузкой модуля

Учитывая следующие два файла .py:

aclass.py

class A(object): pass 

main.py

 def importer(klass): """ Used to import classes from there python qalname """ import_ = lambda m, k: getattr(__import__(m, fromlist=k), k) klass = klass.split('.') module = '.'.join(klass[:-1]) klass = klass[-1] return import_(module, klass) from aclass import A import_A = importer('aclass.A') print isinstance(A(), import_A) # Expected to be true print isinstance(import_A(), A) # Expected to be true 

На этом этапе все работает нормально (моя программа печатает True\nTrue ). Но если я модифицирую метод importer для принудительной перезагрузки, то есть:

эта строка:

  import_ = lambda m, k: getattr(__import__(m, fromlist=k), k) 

заменяется на:

  import_ = lambda m, k: getattr(reload(__import__(m, fromlist=k)), k) 

мои программы возвращаются

 False False 

И я не понимаю этого поведения.

    Перезагрузка модуля означает повторное выполнение его содержимого, в этом случае class A(object): pass . Поэтому он создает другой класс. Это то же поведение, что и:

     class A(object): pass a = A() class A(object): # a different class pass print isinstance(a, A) # False 

    Этого должно быть достаточно, чтобы объяснить, почему голая reload() обычно плохая идея. Я уверен, что другие могут указать на структуры, которые реализуют более сложные процедуры перезагрузки, например, исправление старого класса, которое будет считаться равным новому.