将引用其他类的类转换为python中的dict

时间:2017-02-09 01:26:15

标签: python class dictionary

我的目标是以递归方式将类转换为dict。我知道我需要指定与转换相关的规则,但我觉得内置python有一些方法可以递归类并生成一个dict。请参阅以下代码:

class Foo:
  def __init__(self):
    self.a = 1
    self.b = 2
    self.c = 3

  def __iter__(self):
    yield 'a', self.a
    yield 'b', self.b
    yield 'c', self.c


class Bar:
  def __init__(self, foos):
    self.foos = foos
    self.d = 5

  def __iter__(self):
    yield 'foos', self.foos
    yield 'd', self.d

foos = [Foo(), Foo(), Foo()]

bar = Bar(foos)

print(dict(bar))

结果是:
{'foos': [<__main__.Foo object at 0x108e6be48>, <__main__.Foo object at 0x108e6bef0>, <__main__.Foo object at 0x108e6bf28>], 'd': 5}

在这种情况下,

foosFoo()的列表,我希望看到扩展的词典列表。我知道我可以将以下内容添加到Foo类中以使其工作:

def __repr__(self):
  return repr(dict(self))

获得所需输出的结果:
{'foos': [{'a': 1, 'b': 2, 'c': 3}, {'a': 1, 'b': 2, 'c': 3}, {'a': 1, 'b': 2, 'c': 3}], 'd': 5}

但这种做法看起来很苛刻 - 就像在,我强迫它把自己表现为一个字典,而不是自然可迭代(感觉就像我试图把一个方形钉挂在圆孔里)。

我对python世界的问题是:什么是接近这个的正确方法,以便我可以在我的类上调用dict()并获得完整的字典?

我已经四处寻找,似乎找不到任何特定于此主题的内容,所以我将在这里问一下。如果已经存在,请指出正确的方向。提前感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我提出了两个可以满足你需求的黑客。

第一:通过替换此行在foos变量中公开dicts:

foos = [Foo(), Foo(), Foo()]

这种黑客使用list comprehension

foos =[dict(k) for k in [Foo(), Foo(), Foo()]]

或者,就像这样:

foos = [dict(Foo()), dict(Foo()), dict(Foo())]

然后:

print(dict(bar))
>>> {'d': 5, 'foos': [{'a': 1, 'c': 3, 'b': 2}, {'a': 1, 'c': 3, 'b': 2}, {'a': 1, 'c': 3, 'b': 2}]}

第二:通过替换此行在Bar.__iter__()内公开词组:

yield 'foos', self.foos

由:

yield [dict(k) for k in self.foos]

然后:

print(dict(bar))
>>> {'d': 5, 'foos': [{'a': 1, 'c': 3, 'b': 2}, {'a': 1, 'c': 3, 'b': 2}, {'a': 1, 'c': 3, 'b': 2}]}

奖励(不完全符合您的要求):通过替换此行使用dict comprehension

print(dict(bar))

由:

print({k:v if isinstance(v, int) else [dict(j) for j in v] for k,v in dict(bar).items()})

将打印:

>>> {'d': 5, 'foos': [{'a': 1, 'c': 3, 'b': 2}, {'a': 1, 'c': 3, 'b': 2}, {'a': 1, 'c': 3, 'b': 2}]}