-
Предположим, что
A
является родительским классомB
, аB
является экземпляромB
. Затем может быть вызван метод переопределенияA
с super:super(B, b).method()
. -
Состояние документа "
str(object)
возвращаетobject.__str__()
" в его базовом вызове.
Он должен следовать за str(super(B, b)) == super(B, b).__str__()
, но это не так (интерактивная версия):
class A:
def __str__(self):
return "A"
class B(A):
def __str__(self):
return "B"
b = B()
b_super = super(B, b)
print(str(b_super)) # "<super: <class 'B'>, <B object>>"
print(b_super.__str__()) # "A"
Итак, где я ошибся? Не работает ли супер-механизм для магических методов? В этом случае str
не вызывает __str__
? Связано ли это с этим пунктом:
Обратите внимание, что
super()
реализуется как часть процесса привязки для поиска явных точечных атрибутов, таких какsuper().__getitem__(name)
. Он делает это, реализуя собственный метод__getattribute__()
для поиска классов в предсказуемом порядке, который поддерживает совместное множественное наследование. Соответственно,super()
undefined для неявных поисков с использованием операторов или операторов, таких какsuper()[name]
.