Есть ли преимущества в использовании словарей вместо объектов в Python (или наоборот), когда все, что вы делаете, описывает свойства чего-либо?
В проекте, над которым я сейчас работаю, есть несколько мест, где используются словари, в которых я бы обычно создавал объекты. На мой взгляд, объекты обеспечивают большую структуру и позволяют лучше проверять ошибки программиста такими программами, как pylint, но трудно объяснить , почему я бы использовал объект, а не диктовку.
В качестве примера макета один модуль создает виджеты и содержит такой метод, как этот:
def create(self, propertyA, propertyB=55, propertyC="default",
propertyD=None, propertyE=None, propertyF=None, propertyG=None,
propertyH=None, propertyI=None):
Этот метод будет вызван созданием словаря и передачей его примерно так:
widget_client = WidgetClient()
widget = {
"propertyA": "my_widget",
"propertyB": 10,
...
}
widget_client.create(**widget)
Когда я вижу это, я вижу, что каждое из этих свойств является тем, что описывает «виджет», и хочу сделать следующее:
class Widget(object):
"""Represents a widget."""
def __init__(self, propertyA, **kwargs):
"""Initialize a Widget.
:param propertyA: The name of the widget.
:param kwargs: Additional properties may be specified (see below).
:returns: None
"""
self.propertyA = propertyA
self.propertyB = kwargs.get("propertyB", 55)
self.propertyC = kwargs.get("propertyC", "default")
self.propertyD = kwargs.get("propertyD", None)
self.propertyE = kwargs.get("propertyE", None)
self.propertyF = kwargs.get("propertyF", None)
А затем обновите метод create (), чтобы он выглядел примерно так:
def create(self, widget):
Что в итоге называется так:
widget_client = WidgetClient()
widget = Widget(propertyA="my_widget")
widget.propertyB = 10
...
widget_client.create(widget)
По-моему, это явно лучше, но я ошибался в прошлом и не могу придумать, как объяснить себя. Конечно, я все еще использую ** kwargs, которых можно избежать, разбив виджет на более мелкие компоненты / связанные части и создавая больше объектов и т. Д. И т. Д., Но я считаю, что это хороший «первый шаг». Имеет ли это какой-либо смысл вообще?
Преимущества словаря :
- Быстрее и / или более эффективный объем памяти
Недостатки словаря :
- Невозможность отловить некоторые ошибки при проверке статического кода
- Полный список всех свойств виджета может никогда не появиться или быть известным
Преимущества объектов :
- Точное знание, из чего состоит «Виджет»
- Потенциально ловить ошибки с помощью статических программ проверки кода (хотя использование ** magic предотвращает некоторые из них)
Недостатки объектов :
- Медленная и / или менее эффективная память
Это кажется глупым вопросом, но зачем делать что-то с объектами, которые можно сделать с помощью словарей?