__setattr__()
вызывается, когда используется следующий синтаксис:
obj.key = value
# obj.__setattr__('key', value)
Обратите внимание, что вызов метода (например, вызов .append()
) не активирует это, потому что вы ' re ничего напрямую не устанавливает. (получение метода append
вызовет запуск __getattr__()
).
В большинстве случаев, если вы разработали класс, вы все равно вызовете __setattr__()
в какой-то момент по строке - но для в большинстве встроенных классов функциональность абстрагирована, обрабатывается с помощью макроса или чего-то еще, что «пропускает» шаг __setattr__()
.
Обратите внимание, что метод __setitem__()
также существует для некоторых объектов (не для всех!) И отличается от __setattr__()
, потому что он вызывается другим синтаксисом:
obj[key] = value
# obj.__setitem__('key', value)
но, насколько далеко как я помню, вызов .append()
в списке обычно не вызывает и этого, хотя это может зависеть от того, какую реализацию python вы используете. Это происходит по указанной выше причине - интерпретатор использует ярлыки для выполнения работы для некоторых из основных встроенных классов.