Ответ 1
Короткий ответ
Я называю super (type) неправильно здесь или есть что-то, чего я не хватает?
: да, вы неправильно его называете... И (действительно, потому что) есть что-то, чего вам не хватает.
Но не чувствую себя плохо; это чрезвычайно трудный вопрос.
В документации отмечается, что
Если второй аргумент опущен, возвращаемый супер объект не связан.
Вариант использования для несвязанных объектов super
чрезвычайно узкий и редок. См. Эти статьи Микеле Симионато для обсуждения super()
:
- Что нужно знать о Python Super [1 из 3]
- Что нужно знать о Python Super [2 из 3] (в этом конкретно рассматривается несвязанный супер)
- Что нужно знать о Python Super [3 из 3]
Кроме того, он настоятельно рекомендует удалить unbound super
из Python 3 здесь.
Я сказал, что вы называете это "неправильно" (хотя правильность в значительной степени бессмысленна без контекста, а пример игрушки не дает большого контекста). Поскольку unbound super
настолько редок и, возможно, просто не обоснован, как утверждает Simionato, "правильный" способ использования super()
состоит в том, чтобы предоставить второй аргумент.
В вашем случае самый простой способ сделать ваш пример работы -
class First(object):
@staticmethod
def getlist():
return ['first']
class Second(First):
@staticmethod
def getlist():
l = super(Second, Second).getlist() # note the 2nd argument
l.append('second')
return l
a = Second.getlist()
print a
Если вы думаете, что это выглядит смешно, вы не ошибаетесь. Но я думаю, что большинство людей ожидает, когда они видят super(X)
(или надеясь, когда они попробуют это в своем собственном коде), это то, что дает Python, если вы делаете super(X, X)
.