-
Предположим, что
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].