Я знаю, что методы __getattribute__
и __getattr__
не делают одно и то же; первый отвечает за доступ ко всем атрибутам, а последний, если он определен, вызывается, когда первый вызывает AttributeError.
Что меня удивляет, так это то, что два аналогично названных метода, связанных с доступом к атрибутам, существуют даже для языка, который обычно пытается устранить путаницу. Я даже не могу вспомнить ситуацию, в которой мне нужно было бы определить __getattr__
; Я могу просто определить __getattribute__
, который использует object.__getattribute__
в операторе if или try. Более того, встроенная функция доступа к атрибутам называется getattr
, что может ввести людей в заблуждение, что __getattr__
является методом перехода к атрибутам. Какова история этих двух методов, и есть ли веская причина, по которой они все еще существуют?