Python新手求助:如何用类优化数据获取函数实现属性式访问
用类优化数据获取逻辑的实现方案
针对你的需求,我们可以通过类封装的方式,把数据获取逻辑和数据本身绑定在一起,实现直接通过属性访问单个数据的效果。下面分两种场景给出具体实现:
一、CSV数据读取类
这个类会把CSV读取逻辑封装起来,你可以直接通过类实例的属性访问对应数据,还能按需刷新数据。
实现方式1:初始化时加载数据(缓存型)
适合CSV文件不频繁修改的场景,数据加载一次后会缓存,需要时手动刷新:
import pandas as pd class CSVData: def __init__(self, file_path): self.file_path = file_path # 初始化时自动加载数据 self._load_data() # 内部方法:读取CSV并解析数据 def _load_data(self): data = pd.read_csv(self.file_path) data_dict = data.to_dict() # 将解析后的数据赋值为实例属性 self.weekdays_daily_time = float(data_dict['VALUE'][0]) self.weekend_daily_time = float(data_dict['VALUE'][1]) self.booting_time = float(data_dict['VALUE'][2]) # 手动刷新数据(当CSV文件更新后调用) def refresh(self): self._load_data()
使用示例
# 替换为你的CSV文件路径 CSV_FILE_PATH = "your_data.csv" # 创建类实例 csv_data = CSVData(CSV_FILE_PATH) # 直接访问单个数据 print(csv_data.booting_time) print(csv_data.weekdays_daily_time) # 如果CSV文件更新了,调用refresh刷新数据 csv_data.refresh()
实现方式2:按需加载数据(实时型)
适合CSV文件频繁修改的场景,每次访问属性都会重新读取最新数据:
import pandas as pd class CSVData: def __init__(self, file_path): self.file_path = file_path # 内部方法:读取并返回所有数据 def _get_csv_data(self): data = pd.read_csv(self.file_path) data_dict = data.to_dict() return ( float(data_dict['VALUE'][0]), float(data_dict['VALUE'][1]), float(data_dict['VALUE'][2]) ) # 通过@property装饰器,将方法转为属性 @property def weekdays_daily_time(self): return self._get_csv_data()[0] @property def weekend_daily_time(self): return self._get_csv_data()[1] @property def booting_time(self): return self._get_csv_data()[2]
使用示例
CSV_FILE_PATH = "your_data.csv" csv_data = CSVData(CSV_FILE_PATH) # 每次访问都会重新读取CSV,获取最新值 print(csv_data.booting_time)
二、Domoticz服务器数据获取类
同样的思路,把请求Domoticz服务器的逻辑封装成类,直接通过属性访问所需数据。
实现方式1:初始化时加载数据(缓存型)
适合服务器数据不会频繁变动的场景,缓存数据后手动刷新:
import requests as reqs import json import datetime class DomoticzData: def __init__(self, server, idx): self.server = server self.idx = idx # 初始化时自动请求数据 self._load_data() # 内部方法:请求服务器并解析数据 def _load_data(self): url = f'http://{self.server}/json.htm?type=devices&rid={self.idx}' response = reqs.get(url) response_dict = json.loads(response.text) self.counter_value = int(response_dict["result"][0]["Counter"]) date_from_server = datetime.datetime.strptime(response_dict["ServerTime"], '%Y-%m-%d %H:%M:%S') self.server_date = date_from_server.date() self.day_of_week = self.server_date.weekday() self.today_used = int(response_dict["result"][0]["CounterToday"]) # 手动刷新数据(需要最新服务器数据时调用) def refresh(self): self._load_data()
使用示例
# 替换为你的服务器地址和设备IDX DOMOTICZSERVER = "192.168.1.100:8080" IDX = "123" # 创建类实例 domoticz_data = DomoticzData(DOMOTICZSERVER, IDX) # 直接访问单个数据 print(domoticz_data.counter_value) print(domoticz_data.day_of_week) # 需要最新数据时刷新 domoticz_data.refresh()
实现方式2:按需加载数据(实时型)
适合需要实时获取服务器最新数据的场景,每次访问属性都会发起新请求:
import requests as reqs import json import datetime class DomoticzData: def __init__(self, server, idx): self.server = server self.idx = idx # 内部方法:请求并返回所有数据 def _get_domoticz_data(self): url = f'http://{self.server}/json.htm?type=devices&rid={self.idx}' response = reqs.get(url) response_dict = json.loads(response.text) counter_value = int(response_dict["result"][0]["Counter"]) date_from_server = datetime.datetime.strptime(response_dict["ServerTime"], '%Y-%m-%d %H:%M:%S') server_date = date_from_server.date() day_of_week = server_date.weekday() today_used = int(response_dict["result"][0]["CounterToday"]) return day_of_week, counter_value, server_date, today_used # 通过@property转为可直接访问的属性 @property def day_of_week(self): return self._get_domoticz_data()[0] @property def counter_value(self): return self._get_domoticz_data()[1] @property def server_date(self): return self._get_domoticz_data()[2] @property def today_used(self): return self._get_domoticz_data()[3]
使用示例
DOMOTICZSERVER = "192.168.1.100:8080" IDX = "123" domoticz_data = DomoticzData(DOMOTICZSERVER, IDX) # 每次访问都会发起新请求,获取服务器最新数据 print(domoticz_data.counter_value)
为什么用类优化?
- 封装性:把数据读取/请求逻辑和数据本身绑定,代码更清晰,后续维护时只需修改类内部实现。
- 便捷性:直接通过属性访问单个数据,不用每次调用函数后手动解包返回值。
- 扩展性:后续可以轻松添加新的逻辑(比如数据校验、异常处理)到类中,不用修改多处代码。
内容的提问来源于stack exchange,提问作者Lucas
相关产品推荐
相关产品推荐

