【发布时间】:2021-06-17 20:35:00
【问题描述】:
我有一个类Car,它有一个名为parts 的属性。这个属性是一个列表,会在我的程序的过程中填写。 parts 将包含一个列表其他类型的对象,如Engine、Battery、Wheels 等,它们有自己的属性但不继承自Car。
在我将构建我的Car 对象实例并用所有必要的对象填充它的parts 之后,我想将其转换为字典(易于搜索和比较)并进一步转换为 JSON。我发现__dict__() 是如何用于自定义对象的,这使得它非常快速和有弹性,而无需在Car 类中定义它。但__dict__ 不会递归地为属性部分内的对象创建字典。
我应该如何解决这个问题?我应该在 Car 类中定义我自己的 __dict__() 方法还是有其他方法可以让我的类保持弹性?
解决方案:
感谢@enzo,我向前迈进了一步。他没有给出正确的答案,因为他没有假设Car 类的parts 属性是一个零件列表。有时,Car 可以具有其他属性,即列表帽子没有__dict__ 属性。所以需要更多的检查。
在我的代码下方。 cars 是所有 Car 对象的列表,cars_to_dict 将保留我当前的 cars 列表的“快照”:
cars = list()
cars_to_dict = dict()
for car in cars:
for k, v in car.__dict__.items():
if type(v) == type([list()]):
cars_to_dict = cars_to_dict | { k : list() }
for a in v:
if type(a) == type(Whell()):
cars_to_dict[k].append(a.__dict__)
else:
cars_to_dict[k].append(a)
else:
cars_to_dict = cars_to_dict | { k : list() }
【问题讨论】:
-
您不需要
__dict__来比较对象。请考虑使用数据类。 -
__dict__不将对象转换为字典。 -
“我想把它转换成字典(便于搜索和比较)”老实说,这听起来是个坏主意,这完全不利于首先创建类
-
@juanpa.arrivillaga:我知道我可以在两个对象上使用
==运算符,但我想比较一些确保两者相同的属性。相反,我应该覆盖==运算符吗?
标签: python