Ну, два подхода тесно связаны!Когда вы делаете
stuff.a
, вы действительно получаете доступ к
stulff.__dict__['a']
Аналогично, вы можете создать подкласс dict
, чтобы заставить __getattr__
возвращать то же самое, что и __getitem__
и так stuff.a
также будет работать для вашего dict
подкласса.
Объектный подход часто удобен и полезен, когда вы знаете, что все ключи в вашем отображении будут простыми строками, которые являются действительными идентификаторами Python.Если у вас есть более сложные ключи, тогда вам нужно «реальное» отображение.
Конечно, вы должны также использовать объекты, когда вам нужно больше, чем простое отображение.Это «больше» обычно будет дополнительным состоянием или дополнительными вычислениями для возвращаемых значений.
Вам также следует подумать о том, как другие будут использовать ваши объекты stuff
.Если они знают, что это просто dict
, то они также знают, что могут вызвать stuff.update(other_stuff)
и т. Д. Это не так ясно, если вы вернете им объект.В основном: если вы думаете, что им нужно манипулировать ключами и значениями вашего stuff
как обычного dict
, то вам, вероятно, следует сделать его dict
.
Что касается наиболее «питонического» способачтобы сделать это, я могу только сказать, что я видел, что библиотеки используют оба подхода:
Библиотека BeautifulSoup анализирует HTML и возвращает вам некоторые очень динамичные объекты , где доступ к атрибутам и элементам имеет особое значение.
Они могли бы вместо этого отдавать dict
объекты, но там есть много дополнительных состояний связан с каждым объектом, и поэтому имеет смысл использовать реальный класс.
Конечно, есть также много библиотек, которые просто возвращают обычные dict
объекты - они - хлеби масло многих программ на Python.