7

我有用于从一个系统获取数据、进行一些修改然后将它们输出到另一个系统的类。在我完成所有必要的转换之后,通常会将其转换为 adict或 a 。list

到目前为止,我所做的是我已经调用了两个方法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 回答