7

あるシステムからデータを取得し、いくつかの変更を加えてから、それらを別のシステムに出力するために使用されるクラスがあります。これは通常、必要な変換をすべて行った後、 adictまたは aに変換する方法です。list

これまでのところ、2 つのメソッドを作成as_dict()as_list()、その表現が必要なときにいつでも使用できるようにしました。

dict(instance_of_my_class)しかし、またはを行う方法があるかどうかは気になりますlist(instance_of_my_class)

私は魔法の方法について読んでいますが、これは不可能なようですか?

そして、いくつかの簡単なサンプル コードを使用します。

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,
          [...]
        }
4

1 に答える 1

10

このようなことを意味しますか?その場合、__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を呼び出そうとしているようなので、まったく異なるものを作成して返すことができます。.keys__getitem____iter__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'}
于 2013-04-25T06:22:53.753 に答える