如何在Python中设计含可变列表与字典的复杂数据类型类?
解决方案
首先需要修正你提供的样本数据里的语法错误:its_all字段的写法不符合Python语法——列表中不能直接存放键值对,应该改为字典(如果是多个键值对的集合),或者修正为合法的列表结构。以下是修正后的样本数据:
complicated_data_sample1 = { "name": "test_name", "description": "test_description", "type": "test_type", "its_all": { "overview": {"brand": "dell", "model": "11"}, "Processor": {"Speed": "1222mhz"} } } complicated_data_sample2 = { "name": "test_name2", "description": "test_description2", "type": "test_type2", "its_all": { "Memory": {"flash": "256", "ram": "8gb", "video": "1gb"}, "network": {"switching": "supported", "ports": "16", "features": ["f1", "f2", "f3"]}, "dimension": {"width": "3", "length": "3", "height": "4"} } } complicated_data_sample3 = { "name": "test_name3", "description": "test_description3", "type": "test_type3", "its_all": None }
设计Python类
考虑到每个样本的属性值不同,我们需要用实例属性而非类属性(类属性是所有实例共享的,不适合存储不同样本的个性化数据)。以下是实现方案:
基础实现
class ComplicatedData: def __init__(self, name, description, type_, its_all=None): # 用type_是因为type是Python内置关键字,避免命名冲突 self.name = name self.description = description self.type = type_ self.its_all = its_all
使用示例
通过字典初始化实例,直接访问属性:
# 从样本1创建实例 data1 = ComplicatedData(**complicated_data_sample1) print(data1.name) # 输出: test_name print(data1.its_all["Processor"]["Speed"]) # 输出: 1222mhz # 从样本3创建实例 data3 = ComplicatedData(**complicated_data_sample3) print(data3.its_all) # 输出: None
进阶优化(可选)
如果希望更便捷地访问its_all中的嵌套属性,可以利用dataclasses简化类定义,并添加辅助方法适配键名变化的场景:
from dataclasses import dataclass from typing import Dict, Optional, Any @dataclass class ComplicatedData: name: str description: str type: str its_all: Optional[Dict[str, Any]] = None def get_its_attr(self, top_key, nested_key=None): """快速提取its_all中的嵌套属性""" if not self.its_all or top_key not in self.its_all: return None if nested_key: return self.its_all[top_key].get(nested_key) return self.its_all[top_key] # 使用示例 data2 = ComplicatedData(**complicated_data_sample2) print(data2.get_its_attr("network", "ports")) # 输出: 16 print(data2.get_its_attr("Memory")) # 输出: {'flash': '256', 'ram': '8gb', 'video': '1gb'}
内容的提问来源于stack exchange,提问作者fardV
相关产品推荐
相关产品推荐

