#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])