Почему super () .__ class __.__ name__ не возвращает имя моего базового класса? - PullRequest
1 голос
/ 05 мая 2019

У меня есть базовый класс A, от которого я наследую, чтобы создать класс B.Если я называю имя dunder в экземпляре класса, я получаю имя класса.если я называю имя dunder в базовом классе экземпляра, я получаю имя базового класса.Это имеет смысл до сих пор.Однако, если вызвать имя dunder для экземпляра super (), я не получу имя базового класса и не знаю почему.Чтобы сделать вещи более запутанными, если я вызову имя dunder в базовом классе supers (), я получу правильное имя для базового класса base object.

class A:
    pass


class B(A):
    def __init__(self):
        self.inherited_class_name = self.__class__.__name__
        self.base_class_name = self.__class__.__bases__[0].__name__
        self.should_return_base_class_name = super().__class__.__name__
        self.base_class_base_class = super().__class__.__bases__[0].__name__


if __name__ == '__main__':
    b = B()
    print(b.inherited_class_name)
    print(b.base_class_name)
    print(b.should_return_base_class_name)  # Why does this return "super" instead of "A"?
    print(b.base_class_base_class)  # Especially when this one works...

печатает

B
A
super 
object

Я не понимаю, почему "супер" возвращается из моего should_return_base_class_name вызова.

Ответы [ 2 ]

2 голосов
/ 05 мая 2019

super() возвращает объект super.Если вы спросите Python о __name__ __class__ объекта super, он скажет вам, что это имя super.

См. Официальную документацию : super() возвращает прокси-объект, а не объект базового класса, как вы (я предполагаю) ожидаете.

Тот факт, что вам нужен доступ к супер __class__, должен намекать на это, как если бы super() вернул сам базовый класс, это уже был бы класс, и он не может вернуть его экземпляр, потому что нет указания на то, какой это будет экземпляр.

2 голосов
/ 05 мая 2019

Это потому, что super на самом деле является отдельным классом, который абстрагирует ваш базовый класс. Супер на самом деле не базовый класс. Когда вы делаете super(), вы получаете экземпляр суперкласса, а не экземпляр вашего базового класса.
Если вы попробуете print(super()) в вашем примере, вы получите <super: <class 'B'>, <B object>>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...