将类表示为字典或列表

gaq*_*qzi 6 python idioms structure

我的类用于从一个系统获取数据,进行一些修改然后将它们输出到另一个系统.这通常是在我完成所有必要的转换之后将其转换为a dictlist之后的方式.

到目前为止,我所做的是我已经调用了两个方法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,
          [...]
        }
Run Code Online (Sandbox Code Playgroud)

roo*_*oot 8

你的意思是这样的吗?如果是这样,您必须定义一个__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}
Run Code Online (Sandbox Code Playgroud)

此外,似乎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'}
Run Code Online (Sandbox Code Playgroud)