如何从Python自定义类构建的数据集里提取指定列数据
解决方案
核心实现思路
你需要用到Python内置的getattr()函数(用于根据属性名字符串获取对象属性值),同时建立Excel列名和Item类私有属性的映射关系即可实现需求,提供两种实现方案供你选择:
方案1:实例级取值(推荐,灵活度更高)
不需要修改类的原有结构,仅新增实例方法,自己遍历已有的Item集合获取全量数据:
第一步:修改Item类,新增get_value实例方法
class Item(): # 原有属性、方法代码全部保留,仅新增下面的get_value方法 def get_value(self, title): title = title.lower() # 兼容Excel里的不同列名写法 if title in ("product", "name"): return self.__name elif title in ("cost", "price"): return self.__cost elif title in ("used_by", "gender"): return self.__gender elif title == "prime": return self.__prime raise ValueError(f"不支持的列名:{title},支持列:product/name、cost/price、used_by/gender、prime")
第二步:调用方法获取全量列数据
你已经有所有Item实例组成的集合mylist,直接遍历取值即可:
# 获取所有商品名称列表,和你预期的输出完全一致 product_list = [item.get_value("product") for item in mylist] # 其他列同理,比如获取所有成本列表 cost_list = [item.get_value("cost") for item in mylist]
方案2:类级直接取值(符合你给出的调用形式)
如果希望直接调用方法就返回全量列表,不需要自己遍历,可以把方法设为类方法,同时让Item类自动维护所有创建过的实例:
第一步:修改Item类
class Item(): # 新增:保存所有创建过的Item实例的集合 _all_instances = set() __name = "" __cost = 0 __gender = "" __prime = "" # 修改__init__方法,新增保存实例的逻辑 def __init__(self, name, cost, gender, prime): self.__name = name self.__cost = cost self.__gender = gender self.__prime = prime # 新增:实例创建后自动加入全局集合 self._all_instances.add(self) # 原有其他方法都不变,新增下面的类方法 @classmethod def get_value(cls, title): title = title.lower() res = [] for instance in cls._all_instances: if title in ("product", "name"): res.append(instance.__name) elif title in ("cost", "price"): res.append(instance.__cost) elif title in ("used_by", "gender"): res.append(instance.__gender) elif title == "prime": res.append(instance.__prime) else: raise ValueError(f"不支持的列名:{title},支持列:product/name、cost/price、used_by/gender、prime") return res
第二步:直接调用类方法获取全量数据
# 直接调用就能得到所有商品名称列表 product_list = Item.get_value("product")
用到的Python内置功能说明
这里核心用到的是Python内置的getattr(object, name[, default])函数,作用是获取对象object中名为name的属性的值,如果属性不存在可以返回指定的默认值,刚好匹配你需要根据传入的列名字符串动态取值的需求。
内容的提问来源于stack exchange,提问作者zhangruibo101
相关产品推荐
相关产品推荐

