Подтвердить что ты не робот

Когда использовать класс против 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())
4b9b3361

Ответ 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