Использование super () с одним аргументом в Python 3 - PullRequest
2 голосов
/ 02 августа 2020

Я прочитал довольно много материалов о правильном использовании super с аргументами и без них, но есть кое-что, чего я не понимаю.

Рассмотрим следующий пример:

class A:
    def foo(self):
        pass

class B(A):
    pass

Это часть, которую я понимаю:

super(B, B())  # <bound method A.foo of <__main__.B object at ...>>

, что имеет смысл, поскольку версия super с двумя аргументами, со вторым аргументом, являющимся объектом, возвращает связанный объект.

Допустим, я хочу получить доступ к функции в A, а не к привязанному методу. Я бы попробовал это:

super(B).foo  # AttributeError: 'super' object has no attribute 'foo'

Это та часть, которую я не понимаю.

Попытка «обмануть» super следующим образом работает, хотя:

super(B, B).foo  # <function __main__.A.foo(self)>

Что мне не хватает?

1 Ответ

1 голос
/ 02 августа 2020

super возвращает прокси для некоторого объекта. Чтобы выяснить, какой объект вы хотите использовать для прокси, вам нужно увидеть, как получить ссылку на функцию без использования super.

Если a является экземпляром A, то a.foo дает вам возвращаемое значение A.__dict__['foo'].__get__(a, A), которое является экземпляром method. Чтобы получить саму функцию, вы используете A.foo, что является возвращаемым значением A.__dict__['foo'].__get__(None, A).

Это говорит о том, что вам нужен прокси для класса , а не экземпляра класса. , поэтому вы передаете A, а не экземпляр A, в качестве второго аргумента super.

...