2013-04-25 25 views
6

Bir sistemden veri almak, bazı değişiklikler yapmak ve bunları başka bir sisteme göndermek için kullanılan sınıflarım var. Hangi gerekli tüm dönüşümler yaptıktan sonra genellikle dict veya list dönüştürmek yolu gider.Bir sınıfı bir dict veya liste olarak temsil edin

Şimdiye kadar yaptığım şey, as_dict() ve as_list() adlı iki yöntem yaptığım ve bu gösterime her ihtiyaç duyduğumda kullanmış olduğum.

Ama dict(instance_of_my_class) veya list(instance_of_my_class) yapabilmek için bir yol olup olmadığını merak ediyorum.

magic methods üzerinde çalışıyordum ve bu mümkün değil gibi görünüyor mu?

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

Neden sınıfı bir sözlük/listeye dönüştürmeniz gerekiyor? her sınıfta __dict__ yerleşik bir sınıf vardır, sınıf özniteliklerinin dahili olarak depolandığı yer, belki de bunu depolamak yeterlidir. – theAlse

+1

Temelde 'obj .__ dict__' ile aynı olan vars()' yerleşik var. – gatto

+0

@theAlse özellikle veritabanlarındaki güncellemeler için veya json – gaqzi

cevap

7

böyle bir şey ifade ediyor mu:

Ve bazı basit örnek kod ile çalışmak? Ayrıca

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} 

, list(instance) ve dict(instance) yapabilirsiniz dict çalışır, __iter__ önce .keys/__getitem__ yöntemleri çağırmak için görünüyor: böylece sonuçlar ile anahtar-değer çiftleri bir __iter__ yöntemi tanımlamak varsa Tamamen farklı bir şey döndür.

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

için basit dönüşümü için dönüştürmek için Bu harika, teşekkürler! – gaqzi

+0

@gaqzi - O dict' sen 'listesi (örnek)' ve 'dict (örneği) yapabilirsiniz' __iter__' çağırmadan önce '.keys' çağırmak için' sen :) gerekiyorsa tamamen farklı bir şey dönmek çalışır 'görünüyor – root

+0

Harika! : D Bunun için teşekkürler. Im kimin yapılandırma ve kimlik doğrulama için bir harita verilmektedir soyut bir sınıf veritabanından devralır ayrılmakta veritabanı kütüphaneleri (sınıfların) yapısına geliştirilmesi. –

İlgili konular