Я пытаюсь понять, когда использовать __getattr__
или __getattribute__
. Упоминания документации __getattribute__
относится к модернизированным классам. Что такое модернизированные классы?
Ключевое различие между __getattr__
и __getattribute__
заключается в том, что __getattr__
вызывается только в том случае, если атрибут не был найден обычными способами. Это хорошо для реализации запасного варианта для отсутствующих атрибутов, и, вероятно, это один из двух вариантов, которые вам нужны.
__getattribute__
вызывается перед просмотром фактических атрибутов объекта, и поэтому может быть сложным для правильной реализации. Вы можете легко попасть в бесконечные рекурсии.
Классы нового стиля происходят от object
, классы старого стиля - это те классы в Python 2.x, у которых нет явного базового класса. Но различие между классами старого и нового стиля не является важным при выборе между __getattr__
и __getattribute__
.
Вы почти наверняка хотите __getattr__
.
Классы нового стиля наследуются от объект
, или из другого нового класса стиля:
class SomeObject(object):
pass
class SubObject(SomeObject):
pass
Классы старого стиля не работают:
class SomeObject:
pass
Это применимо только к Python 2 - в Python 3 все вышеперечисленное создаст классы нового стиля.
См. 9. Классы (учебник по Python), NewClassVsClassicClass и В чем разница между классами старого и нового стиля в Python? для получения подробной информации.
Классы нового стиля - это классы, которые образуют подкласс «объект» (прямо или косвенно). У них есть метод класса __ new __
в дополнение к __ init __
, и они имеют несколько более рациональное низкоуровневое поведение.
Обычно вам нужно переопределить __ getattr __
(если вы переопределяете то же самое), иначе вам будет сложно поддерживать синтаксис self.foo в ваших методах.
Дополнительная информация: http://www.devx.com/opensource/Article/31482/0/page/4