Python3 переопределяет класс: супер все еще вызывает старый класс

#python-3.x #class #redefinition

#python-3.x #класс #переопределение

Вопрос:

Этот код:

 class a:  def __init__(self):  print("a here")  class b(a):  def __init__(self):  print("b here")  super().__init__()  B = b()  class a:  def __init__(self):  print("NEW a here")  BB = b()  

производит этот результат:

 b here a here b here a here  

Почему?

Если я изменю super().init() в классе b на a.init(self), он будет работать правильно.

Ответ №1:

Класс b содержит ссылку на свой базовый класс(классы). Эта ссылка создается при создании класса, а не просматривается по имени позже, когда super вызывается. Таким образом, «неправильное» поведение, которое вы видите, на самом деле является ожидаемым поведением. Чтобы изменить то, что класс b считает своим базовым классом, вам b тоже нужно переопределить.

Ответ №2:

Я думаю, что это происходит потому, что класс b все еще наследуется от исходного класса a, который вы определили. Вы можете проверить это, распечатав идентификаторы классов a

 id(a) id(b.__bases__[0])