Когда использовать класс против dict в python?
При рассмотрении дизайна, в каких случаях имеет смысл использовать класс против dict? Плюсы и минусы были бы полезны.
Например,
class AlbumState:
""" AlbumState class, tracks photos shown, etc"""
def __init__ (self, album):
""" album for this object will track state"""
self.album = album
self.photos_shown = []
self.photos_notshown = range(album.size())
против
albumstate['album'] = album
albumstate['photos_shown'] = []
albumstate['photos_notshown'] = range(album.size())
Ответы
Ответ 1
Я бы сказал, что первый и самый важный критерий для того, чтобы отличить, следует ли использовать класс или словарь, - просто хотите иметь некоторое хранилище данных, или вы также хотите иметь некоторую логику (т.е. методы).
Если вам нужно всего лишь собрать несколько данных, то словарь может быть способом. С другой стороны, если вам нужны операции, выполняемые над этими данными, и между данными и операциями (формированием своего рода сущности) существует очень тесная взаимосвязь, то это действительно требует использования класса.
Как указывает @Ben, вы можете начать использовать только словарь, когда у вас есть куча связанных данных, и если в какой-то момент вы поймете, что вам также нужна логика для этих данных, вы можете превратить словарь в класс.
Вы также можете взглянуть на Unified Modeling Language (UML) и его диаграммы классов на получите лучшее представление о том, как использовать классы. Если вы просто выполняете некоторые сценарии или программируете небольшое приложение, вам может не понадобиться использовать UML, но если вы разрабатываете более сложную и сложную систему, это может действительно помочь вам решить, что и сколько классов вам нужно заранее.
Ответ 2
A dict
может использовать любое хешируемое значение как ключ, в то время как экземпляр class
должен иметь строки, которые являются юридическими идентификаторами в качестве "ключей". Таким образом, вы можете объединить произвольные данные в dict
.
Довольно часто использовать тривиальный класс в качестве более удобного dict
, когда ваши значения ключей будут все равно действительными строками идентификатора:
class Box:
pass
x = Box()
x.a = 0
x.b = 1
d = {}
d["a"] = 0 # "x.a" is easier to type than this
d["b"] = 1
print("Current value for 'a' is: {}".format(x.a))
Как только вы начнете делать правильный объектно-ориентированный дизайн, и у вас есть функции метода, которые идут вместе с данными, вы хотите, чтобы данные были в соответствующем классе, чтобы вы могли связать функции метода в. Это правомерно имеют диктофон и несколько глобальных функций, которые работают на нем, но если они все связаны, просто имеет смысл объединить их в class
.
И, наконец, обратите внимание, что dict
является строительным блоком, который используется для реализации class
. Если вы храните значения в классе, они фактически хранятся внутри внутреннего dict
, и для доступа к ним есть только удобный синтаксис.
print(x.a) # prints 1
print(x.__dict__["a"]) # does exact same thing as previous line