2013-04-25 12 views
6

Ho classi che vengono utilizzate per ottenere dati da un sistema, apportando alcune modifiche e quindi trasferendole in un altro sistema. Che di solito va convertito in un dict o list dopo aver effettuato tutte le conversioni necessarie.Rappresenta una classe come dict o lista

Finora quello che ho fatto è che ho fatto due metodi chiamati as_dict() e as_list() e li ho usati ogni volta che ho bisogno di quella rappresentazione.

Ma sono curioso di sapere se c'è un modo per essere in grado di fare dict(instance_of_my_class) o list(instance_of_my_class).

Ho letto il magic methods e sembra che questo non sia possibile?

E alcuni esempi di codice semplice per lavorare con:

class Cost(object): 
    @property 
    def a_metric(self): 
     return self.raw_data.get('a_metric', 0) * 0.8 

    [..] 
    # Repeat for various kinds of transformations 

    def as_dict(self): 
     return { 
      'a_metric': self.a_metric, 
      [...] 
     } 
+0

perché è necessario trasformare la classe in un dizionario/elenco? ogni classe ha un __dict__ incorporato, cioè dove gli attributi di classe sono memorizzati internamente, forse è sufficiente archiviarli. – theAlse

+1

C'è il componente 'vars()' che è praticamente lo stesso di 'obj .__ dict__'. – gatto

+0

@theAlse principalmente per la conversione per gli aggiornamenti nei database o per la semplice conversione in json – gaqzi

risposta

7

Vuoi dire qualcosa di simile? Se quindi si deve definire un metodo __iter__ che coppie chiave-valore di resa:

In [1]: class A(object): 
    ...:  def __init__(self): 
    ...:  self.pairs = ((1,2),(2,3)) 
    ...:  def __iter__(self): 
    ...:   return iter(self.pairs) 
    ...:  

In [2]: a = A() 

In [3]: dict(a) 
Out[3]: {1: 2, 2: 3} 

Inoltre, sembra che dict tenta di chiamare i metodi .keys/__getitem__ prima __iter__, in modo da poter fare list(instance) e dict(instance) restituire qualcosa di completamente diverso.

In [4]: class B(object): 
    ...:  def __init__(self): 
    ...:  self.d = {'key':'value'} 
    ...:  self.l = [1,2,3,4] 
    ...:  def keys(self): 
    ...:   return self.d.keys() 
    ...:  def __getitem__(self, item): 
    ...:   return self.d[item] 
    ...:  def __iter__(self):   
    ...:   return iter(self.l) 
    ...:  

In [5]: b = B() 

In [6]: list(b) 
Out[6]: [1, 2, 3, 4] 

In [7]: dict(b) 
Out[7]: {'key': 'value'} 
+0

Questo funziona meravigliosamente, grazie! – gaqzi

+0

@gaqzi - Sembra che 'dict' prova a chiamare' .keys' prima di chiamare '__iter__' in modo da poter fare' list (instance) 'e' dict (instance) 'restituisce qualcosa di completamente diverso se è necessario :) – root

+0

Fantastico !! : D Grazie per questo. Sto sviluppando una struttura di diverse librerie di database (classi) che ereditano da una classe astratta Database che riceve una mappa per la configurazione e l'autenticazione. –

Problemi correlati