2012-06-19 18 views
29

Al considerar el diseño, ¿en qué casos tiene sentido usar clase versus dict? Pros & Contras sería útil también.Cuándo usar class versus dict en python?

Por ejemplo,

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()) 

frente

albumstate['album'] = album 
albumstate['photos_shown'] = [] 
albumstate['photos_notshown'] = range(album.size()) 
+0

relacionada a [Python:? ¿Debo usar una clase o diccionario] (http://stackoverflow.com/questions/4045161/python-should-i-use-a-class-or-dictionary) y para [Convertir Python Dict a Object?] (http://stackoverflow.com/questions/1305532/convert-python-dict-to-object) – ChaimG

Respuesta

27

Yo diría que los primeros y más importantes criterios para distinguir si se debe utilizar una clase o un diccionario es si lo que desea es tener un poco de datos almacenamiento o también desea tener algo de lógica (es decir, métodos).

Si solo necesita juntar varios datos, entonces un diccionario podría ser el camino a seguir. Por otro lado, si necesita operaciones realizadas sobre esos datos, y existe una relación muy estrecha entre los datos y las operaciones (que forman un tipo de entidad), entonces eso realmente requiere el uso de una clase.

Como lo sugiere @Ben, puede comenzar a usar solo un diccionario cuando tenga un montón de datos relacionados, y si en algún momento se da cuenta de que también necesita lógica para esos datos, puede convertir el diccionario en una clase.

También puede echar un vistazo a Unified Modeling Language (UML) y su class diagrams para tener una mejor idea de cómo usar las clases. Si solo está haciendo scripting o programando una aplicación pequeña, puede que no necesite usar UML, pero si está diseñando un sistema más grande y complejo, realmente puede ayudarlo a decidir qué y cuántas clases necesita de antemano.

+1

solo agregaría, puedes tomar fácilmente un dict y convertirlo una clase más adelante si resulta que creías que solo querías la asociación de datos, pero posteriormente necesitas lógica. Además, considere usar defaultjudice, ya que parece que se comportará como quiere que se comporten sus dicts. – Ben

15

A dict puede usar cualquier valor hashable como clave, mientras que una instancia class necesita tener cadenas que son identificadores legales como sus "claves". Entonces puede agrupar datos arbitrarios en un dict.

Es bastante común el uso de una clase trivial como un más-conveniente dict cuando sus valores clave serán todos cadenas válidas identificador de todos modos:

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)) 

Tan pronto como empiece a hacer un diseño adecuado orientado a objetos, y tiene funciones de método que van junto con los datos, desea tener los datos en una clase adecuada para que pueda agrupar las funciones del método. Es legal tener solo un dict y un puñado de funciones globales que operen en él, pero si todos están relacionados, simplemente tiene sentido agruparlos en un class.

Y, por último, tenga en cuenta que un dict es un bloque de construcción que se utiliza para implementar un class. Si almacena valores en una clase, en realidad están almacenados dentro de un dict interno y solo hay alguna sintaxis conveniente para acceder a ellos.

print(x.a) # prints 1 

print(x.__dict__["a"]) # does exact same thing as previous line 
+0

Excelente respuesta. Especialmente la parte: "... y tiene funciones de método que van junto con los datos, quiere tener los datos en una clase adecuada para que pueda agrupar las funciones de método.Es legal tener solo un dict y un puñado de funciones globales que operan en él, pero si están relacionadas, tiene sentido agruparlas en una "clase". Ese es uno de los principales puntos de venta de OOP : Agrupación de métodos y datos para que no tengamos funciones globales que funcionen con variables sueltas. – Ugur

Cuestiones relacionadas