2013-04-25 7 views
6

私はあるシステムからデータを取得し、いくつかの変更を加えて別のシステムに出力するためのクラスを持っています。これは通常、私が必要な変換をすべて行った後にdictまたはlistに変換する方法になります。クラスをdictまたはリストとして表現する

これまで私が行ったことは、as_dict()as_list()という2つのメソッドを作成し、その表現が必要なときはいつでも使用していたことです。

私は好きな方法があれば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

+1

基本的に 'obj .__ dict__'と同じ' vars() 'が組み込まれています。 – gatto

+0

@theAlseは主にデータベースの更新やjsonへの簡単な変換のために変換するためのものです – gaqzi

答えて

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

+0

@gaqzi - 'dict'は' __iter__'を呼び出す前に '.keys'を呼び出そうとしているので、' list(instance) 'と' dict(instance) – root

+0

驚くばかり! :Dこれに感謝します。私は構成と認証のためのマップを受け取る抽象クラスのデータベースから継承した異なるデータベースライブラリ(クラス)の構造を開発しています。 –

関連する問題