2013-04-25 5 views
6

Ich habe Klassen, die verwendet werden, um Daten von einem System zu erhalten, einige Änderungen vorzunehmen und sie dann in ein anderes System auszugeben. Was normalerweise der Weg ist, es in eine dict oder eine list zu konvertieren, nachdem ich alle notwendigen Konvertierungen vorgenommen habe.Stellen Sie eine Klasse als ein Dict oder eine Liste dar.

Bisher habe ich zwei Methoden namens as_dict() und as_list() gemacht und verwendet, wenn ich diese Darstellung brauche.

Aber ich bin neugierig, ob es eine Möglichkeit gibt, dict(instance_of_my_class) oder list(instance_of_my_class) zu tun.

Ich habe gelesen auf magic methods und es scheint, als ob das nicht möglich ist?

Und einige einfache Beispielcode, mit arbeiten:

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

Warum müssen Sie die Klasse in ein Wörterbuch/eine Liste umwandeln? Jede Klasse hat ein eingebautes __dict__, das ist, wo Klassenattribute intern gespeichert werden, vielleicht reicht es aus, das zu speichern. – theAlse

+1

Es gibt 'vars()' eingebaut, was im Grunde dasselbe ist wie 'obj .__ dict__'. – gatto

+0

@theAlse hauptsächlich für die Konvertierung für Updates in Datenbanken oder für die einfache Umwandlung in JSON – gaqzi

Antwort

7

Sie so etwas wie dies bedeuten Sie? Wenn ja müssen Sie eine __iter__ Methode definieren, die Ausbeute der Schlüssel-Wert-Paare:

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} 

Auch scheint es, dass dict versucht, die .keys/__getitem__ Methoden vor __iter__ zu nennen, so dass Sie list(instance) machen und dict(instance) etwas ganz anderes zurückgeben.

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

Das funktioniert wunderbar, danke! – gaqzi

+0

@gaqzi - Es scheint, dass 'dict' versucht,' .keys' aufzurufen, bevor '_____ aufgerufen wird, so dass 'list (instance)' und 'dict (instance)' etwas völlig anderes zurückgeben können, wenn es nötig ist :) – root

+0

Super !! : D Danke dafür. Ich entwickle eine Struktur von verschiedenen Datenbankbibliotheken (Klassen), die von einer abstrakten Klasse erbt Datenbank, die eine Karte für Konfiguration und Authentifizierung erhalten. –

Verwandte Themen