Различие между __ getattr __ по сравнению с __ getattribute __

Я пытаюсь понять, когда использовать __getattr__ или __getattribute__. Упоминания документации __getattribute__ относится к модернизированным классам. Что такое модернизированные классы?

377
задан dreftymac 5 April 2017 в 13:39
поделиться

3 ответа

Ключевое различие между __getattr__ и __getattribute__ заключается в том, что __getattr__ вызывается только в том случае, если атрибут не был найден обычными способами. Это хорошо для реализации запасного варианта для отсутствующих атрибутов, и, вероятно, это один из двух вариантов, которые вам нужны.

__getattribute__ вызывается перед просмотром фактических атрибутов объекта, и поэтому может быть сложным для правильной реализации. Вы можете легко попасть в бесконечные рекурсии.

Классы нового стиля происходят от object, классы старого стиля - это те классы в Python 2.x, у которых нет явного базового класса. Но различие между классами старого и нового стиля не является важным при выборе между __getattr__ и __getattribute__.

Вы почти наверняка хотите __getattr__.

453
ответ дан 22 November 2019 в 23:57
поделиться

Классы нового стиля наследуются от объект , или из другого нового класса стиля:

class SomeObject(object):
    pass

class SubObject(SomeObject):
    pass

Классы старого стиля не работают:

class SomeObject:
    pass

Это применимо только к Python 2 - в Python 3 все вышеперечисленное создаст классы нового стиля.

См. 9. Классы (учебник по Python), NewClassVsClassicClass и В чем разница между классами старого и нового стиля в Python? для получения подробной информации.

15
ответ дан 22 November 2019 в 23:57
поделиться

Классы нового стиля - это классы, которые образуют подкласс «объект» (прямо или косвенно). У них есть метод класса __ new __ в дополнение к __ init __ , и они имеют несколько более рациональное низкоуровневое поведение.

Обычно вам нужно переопределить __ getattr __ (если вы переопределяете то же самое), иначе вам будет сложно поддерживать синтаксис self.foo в ваших методах.

Дополнительная информация: http://www.devx.com/opensource/Article/31482/0/page/4

6
ответ дан 22 November 2019 в 23:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: