2010-07-28 21 views
31

A veces tiene sentido agrupar los datos relacionados. Tiendo a hacerlo con un diccionario, por ejemplo,Usar la clase de Python como contenedor de datos

self.group = dict(a=1, b=2, c=3) 
print self.group['a'] 

Uno de mis colegas prefiere crear una clase

class groupClass(object): 
    def __init__(a, b, c): 
     self.a = a 
     self.b = b 
     self.c = c 
self.group = groupClass(1, 2, 3) 
print self.group.a 

Tenga en cuenta que no estamos definiendo los métodos de la clase.

Me gusta usar un dict porque me gusta minimizar el número de líneas de código. Mi colega piensa que el código es más legible si usa una clase, y facilita agregar métodos a la clase en el futuro.

¿Qué prefieres y por qué?

+1

Su colega debe haber un nuevo programador. –

+0

nitpick menor: usaría 'print self.group ['a']' –

+3

@Jesse: No, él no es un nuevo programador (y es un buen programador), pero hace más Java que Python, por lo que le gusta agregar mucho de código (getters, etc.) que creo que es innecesario. También es posible que no represente bien su posición. –

Respuesta

32

Si realmente no define ningún método de clase, un diccionario o una namedtuple mucho más sentido , en mi opinión. Simple + builtin es bueno! A cada cual, lo suyo.

+8

namedtuple's son geniales; solo recuerda que son inmutables. Y no olvide que si necesita agregar métodos de clase más adelante, siempre puede heredar el resultado de namedtuple. P.ej. 'class Point (namedtuple ('Point', 'x y')): ...' –

+0

Excelentes respuestas por todas partes. Escogí este porque me gusta la sugerencia de probar una tupida nombrada. –

+2

Un ejemplo de cómo usar 'namedtuple' con el código OP puede ser bueno. – tokland

8

Prefiero seguir YAGNI y usar un dict.

+0

Acepto, excepto que realmente disfruto de la comodidad del acceso a los atributos (como en JavaScript), así que prefiero usar un [AttributeDict] (http://stackoverflow.com/questions/4984647/accessing-dict-keys-like- an-attribute-in-python). – voithos

1

En un lenguaje que lo admita, usaría un struct. Un diccionario sería el más cercano a una estructura en Python, al menos hasta donde yo lo veo.

no hablar, se podría añadir un método a un diccionario de todos modos si realmente querías;)

2

No estoy de acuerdo con que el código sea más legible usando una clase sin métodos. Por lo general, espera la funcionalidad de una clase, no solo de datos.

Por lo tanto, me gustaría ir a un diccionario hasta que la necesidad de funcionalidad surge, y luego el constructor de la clase podría recibir un diccionario :-)

1

un diccionario es obviamente adecuado para esa situación. Fue diseñado específicamente para ese caso de uso. A menos que realmente vaya a usar la clase como clase, no tiene sentido reinventar la rueda e incurrir en gastos adicionales/perder el espacio de una clase que actúa como un diccionario incorrecto (sin funciones de diccionario).

2

Puede combinar las ventajas de dict y class juntos, utilizando alguna clase de contenedor heredada de dict. No necesita escribir un código repetitivo, y al mismo tiempo puede usar la notación de puntos.

class ObjDict(dict): 
    def __getattr__(self,attr): 
     return self[attr] 
    def __setattr__(self,attr,value): 
     self[attr]=value 

self.group = ObjDict(a=1, b=2, c=3) 
print self.group.a 
2

Hay una nueva propuesta que tiene como objetivo poner en práctica exactamente lo que está buscando, llamados data classes. Mira esto.

Usar una clase sobre un dict es una cuestión de preferencia. Personalmente prefiero usar un dict cuando las claves no se conocen a priori. (Como un contenedor de mapeo).

Usar una clase para almacenar datos significa que puede proporcionar documentación a los atributos de clase.

Personalmente, ¡quizás la razón más importante por la que uso una clase es hacer uso de la función de autocompletar IDEs! (Técnicamente una razón cojo, pero muy útil en la práctica)

+0

La propuesta ahora es oficial en Python 3.7 –

3

Antecedentes

, un resumen de los contenedores de datos basados ​​en atributos alternativos fueron presentados por R. Hettinger en 2017 de vacaciones meetup del SF Python. Vea su tweet y su slide deck.

Se mencionan otros tipos de contenedores de datos en este article y predominantemente en la documentación de Python 3 (ver enlaces a continuación).

Opciones

Alternativas en la biblioteca estándar

Opciones externas

  • records: namedtuple mutable
  • bunches: añadir el acceso al atributo dicts (inspiración para SimpleNamedspace)
  • box: envolver predice con dot-style lookup funcionalidad

¿Cuál?

Decidir qué opción usar depende de la situación. Por lo general, un diccionario mutable pasado de moda o un nombre inmutable es lo suficientemente bueno. Las clases de datos son la última adición (Python 3.7a) que ofrece tanto la mutabilidad como optional immutability, con la promesa de una repetición reducida según lo inspirado por el proyecto attrs.

0

¿Qué hay de Prodict:

class Person(Prodict): 
    name: str 
    email: str 
    rate: int 

john = Person(name='John', email='[email protected]') 
john.rate = 7 
john.age = 35 # dynamic 
Cuestiones relacionadas