__getattr__
вызывается, когда атрибут запрашивается для получения, но недоступен из запрашиваемого объекта.
Предполагается, что x
не имеет a
, такой вызов как
result = x.a
функционально эквивалентно
result = getattr(x, "a")
, что функционально эквивалентно
result = type(x).__getattr__(x, "a")
который обычно совпадает с
result = x.__getattr__("a")
Последние два варианта отличаются, только если __getattr__
привязан к объекту вместо класса (, который может не работать )
Как вы можете видеть здесь, __getattr__
должен возвращать значение, которое должно иметь a
.
Он также может устанавливать атрибут напрямую, чтобы дальнейшие запросы на получение неВызовите __getattr__
снова, но обрабатываются непосредственно Python.Это зависит от конкретного варианта использования, если это имеет смысл (в вашем случае это имеет смысл).
x.b.c = 2
обычно переводится здесь как-то вроде
setattr(x.__getattr__("b"), "c", 2)
Опять же, __getattr__
должен вернуть здесь объект, для которого установлен атрибут c
.