Разница между поиском динамического поля Python - PullRequest
1 голос
/ 12 марта 2010

Какая разница (если есть) между

model.__dict__['title_en']

и

model.__getattribute__('title_en')

а какая лучшая практика?

Ответы [ 3 ]

5 голосов
/ 12 марта 2010

Как уже говорили другие, встроенный getattr является правильным способом получения атрибута (обычно вы не обращаетесь к специальным методам Python напрямую: вы обращаетесь к ним через встроенные модули и операторы! ).

getattr делает намного больше, чем поиск в __dict__ объекта: он поддерживает свойства и другие дескрипторы, атрибуты, унаследованные от класса и его баз (например, методы), атрибуты, которые могут динамически генерироваться с помощью __getattr__ метод (в классе объекта или, опять же, в одной из его баз). Точно так же, как прямой доступ model.title_en, когда вы знаете имя во время написания кода (в этом случае, конечно, вы не будете использовать getattr ;-). Это делает его безусловно предпочтительным способом доступа к атрибуту, имя которого вы «узнаете» только динамически!

5 голосов
/ 12 марта 2010

Лучшая практика? Используйте getattr .

getattr(model, 'title_en')

Вы хотите __getattr__ или __getattribute__, только если хотите переопределить механизм извлечения атрибутов по умолчанию.

1 голос
/ 12 марта 2010

Первый не будет работать, потому что __dict__ должен быть словарем, а не функцией. И правильный путь - getattr(model, 'title_en').

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...