Почему супер класс имеет разные идентификаторы объектов в python?

#python #inheritance

Вопрос:

Рассмотрим такой фрагмент кода:

 class C:
    def __init__(self):
        print(id(self))


class D(C):
    def __init__(self):
        super(D, self).__init__()
        print(id(super(D, self)))


if __name__ == '__main__':
    d = D()
 

что производит для меня:

 140267543158096
140267543678800
 

Почему это происходит?
Я ожидал, что результат должен быть одинаковым, потому что super(D, self) и self in C -это один и тот же объект.

Комментарии:

1. Потому super(C, self)) что in D.__init__ -это super объект , тогда id(self) как in C -это D объект. Это два разных типа объектов , не говоря уже об идентичных объектах. Попробуйте печатать type(self) C.__init__ снова и type(super(C, self)) D.__init__ снова . Вы должны понимать, super что это класс , он возвращает объект особого типа, который действует как прокси для вызова метода, предоставляя вам следующий метод в порядке разрешения метода .

2. Обратите внимание, что, как правило, вы не вызывали super(C, self) бы внутри метода D . Это возможно, но необычно

3. @juanpa.arrivillaga Я обновил код, но результат тот же.

4. Пожалуйста, прочтите мой первый комментарий . Второй был в стороне, это не имеет отношения к такому поведению.