创建对象列表的最佳方式



food_data是一个包含JSON数据的变量。使用这些数据,我想创建一个Food对象列表,比如

foods = []
for data_row in food_data:
foods.append(Food(data_row))

这就是我的美食课现在的样子:

class Food(dict):
""" by inheriting from dict, Food objects become automatically serializable for JSON formatting """
def __init__(self, data):
""" create a serialized food object with desired fields """
id = data["id"]
name = data["title"]
image = data["image"]
super().__init__(self, id=id, name=name, image=image)

下面是一些示例数据:

[
{
"id": 738290,
"title": "Pasta with Garlic, Scallions, Cauliflower & Breadcrumbs",
"image": "https://spoonacular.com/recipeImages/716429-312x231.jpg",
},
{
"id": 343245,
"title": "What to make for dinner tonight?? Bruschetta Style Pork & Pasta",
"image": "https://spoonacular.com/recipeImages/715538-312x231.jpg",
}
]

我可以为Food类编写一个方法来获取数据并返回其不同版本的列表吗

我会从而不是子类化dict开始:有一种更好的方法可以使Food的实例可序列化。

接下来,让Food.__init__变哑:三个参数,用于设置三个属性。

然后,定义一个类方法,负责解析至少具有idtitleimage密钥的任意dict,以获得Food.__init__所期望的值。

最后,定义一个方法,将Food的实例转换回dict(尽管不一定与from_dict使用的dict相同;生成一个以您想要的方式序列化的方法(。

class Food:
def __init__(self, id, name, image):
self.id = id
self.name = name
self.image = image
@classmethod
def from_dict(cls, d):
return cls(id=d['id'], name=d['title'], image=d['image'])
def to_dict(self):
return dict(id=self.id, name=self.name, image=self.image)
foods = [Food.from_dict(d) for d in food_data]

要使实例可序列化,请定义一个使用to_dict方法的客户编码器

class FoodEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, Food):
return obj.to_dict()
return super().default(obj)

这个搭载在默认编码器上;如果立即对象是Food,则default返回可序列化的dict。否则,它会推迟到其父级尝试序列化它

然后在对json.dumps的调用中使用该类。

print(json.dumps(foods, cls=FoodEncoder))

我认为在我的情况下,我可能已经过度设计了我的代码。但我收到了很多回复,这些回复确实在其他方面帮助了我,所以我将在这里提供它们:

@Juanpa使用列表理解

foods = [Food[data] for data in food_data]

@Chepner-无关但有用json子类。JSONEncoder而不是dict用于可序列化

@Matthias在类中创建一个静态方法以返回对象列表

@staticmethod
def create_foods(food_data):
foods = []
for data_row in food_data:
foods.append(Food(data_row))

最新更新