gaq*_*qzi 6 python idioms structure
我的类用于从一个系统获取数据,进行一些修改然后将它们输出到另一个系统.这通常是在我完成所有必要的转换之后将其转换为a dict或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,
[...]
}
Run Code Online (Sandbox Code Playgroud)
你的意思是这样的吗?如果是这样,您必须定义一个__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)