2013-04-25 9 views
6

Mam klasy, które są używane do pobierania danych z jednego systemu, dokonywania pewnych modyfikacji, a następnie wysyłania ich do innego systemu. Zwykle przechodzi to konwersję na dict lub list po wykonaniu wszystkich niezbędnych konwersji.Reprezentowanie klasy jako dyktowanej lub listy

Do tej pory zrobiłem dwie metody o nazwie as_dict() i as_list() i użyłem tego, gdy potrzebuję tej reprezentacji.

Ale jestem ciekawy, czy istnieje sposób, aby móc wykonać dict(instance_of_my_class) lub list(instance_of_my_class).

Czytałem w górę na magic methods i wydaje się, że to nie jest możliwe?

A niektóre prosty przykładowy kod do pracy z:

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

dlaczego trzeba przekształcić klasę w słownik/listę? każda klasa ma wbudowany __dict__, czyli tam, gdzie atrybuty klas są przechowywane wewnętrznie, może wystarczy je zapisać. – theAlse

+1

Istnieje 'vars()', który jest w zasadzie taki sam jak 'obj .__ dict__'. – gatto

+0

@theAlse głównie do konwersji na aktualizacje w bazach danych lub do prostej konwersji na json – gaqzi

Odpowiedz

7

Czy znaczy, że coś takiego? Jeśli więc trzeba zdefiniować __iter__ sposób, że pary klucz-wartość wydajności za:

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} 

Ponadto wydaje się, że dict próbuje wywołać metody .keys/__getitem__ przed __iter__, więc można zrobić list(instance) i dict(instance) zwrócić coś zupełnie innego.

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

Działa to cudownie, dzięki! – gaqzi

+0

@gaqzi - Wydaje się, że 'dict' próbuje wywołać' .keys' przed wywołaniem '__iter__', dzięki czemu możesz zrobić' list (instance) 'oraz' dict (instance) 'zwracając coś zupełnie innego jeśli potrzebujesz :) – root

+0

Niesamowite !! : D Dzięki za to. Zajmuję się tworzeniem struktury różnych bibliotek baz danych (klas), które dziedziczą z abstrakcyjnej klasy Baza danych, która otrzymuje mapę do konfiguracji i uwierzytelniania. –

Powiązane problemy