2013-04-25 33 views
6

我有一些類用於從一個系統獲取數據,進行一些修改,然後將它們輸出到另一個系統中。在我完成所有必要的轉換後,通常會將其轉換爲dictlist將字典表示爲字典或列表

到目前爲止,我所做的是,我做了兩個方法稱爲as_dict()as_list()和使用,每當我需要的代表性。

但我很好奇,如果有辦法可以做到dict(instance_of_my_class)list(instance_of_my_class)

我一直在閱讀magic methods,好像這是不可能的?

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

爲什麼你需要將類轉換成字典/列表?每個類都有一個內置的__dict__,這是內部存儲類屬性的地方,也許只是存儲它。 – theAlse 2013-04-25 06:15:46

+1

內建'vars()',它與'obj .__ dict__'基本相同。 – gatto 2013-04-25 06:19:18

+0

@theAlse主要用於將其轉換爲數據庫中的更新或簡單轉換爲json – gaqzi 2013-04-25 06:32:00

回答

7

你的意思是這樣的:

和一些簡單的示例代碼一起工作呢?如果是這樣,你必須定義一個__iter__方法產量的鍵值對:

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} 

而且,似乎dict嘗試__iter__.keys/__getitem__方法調用,這樣就可以使list(instance)dict(instance)返回完全不同的東西。

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

這非常有用,謝謝! – gaqzi 2013-04-25 06:33:17

+0

@gaqzi - 在調用'__iter__'前,'dict'似乎嘗試調用'.keys',這樣如果需要,可以使'list(instance)'和'dict(instance)'返回完全不同的東西:) – root 2013-04-25 07:27:28

+0

真棒! :D感謝你。我開發了一個從抽象類數據庫繼承的不同數據庫庫(類)的結構,該數據庫接收一個用於配置和認證的映射。 – 2017-05-19 20:02:52