You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

为什么用类优化?

  1. 封装性:把数据读取/请求逻辑和数据本身绑定,代码更清晰,后续维护时只需修改类内部实现。
  2. 便捷性:直接通过属性访问单个数据,不用每次调用函数后手动解包返回值。
  3. 扩展性:后续可以轻松添加新的逻辑(比如数据校验、异常处理)到类中,不用修改多处代码。

内容的提问来源于stack exchange,提问作者Lucas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 21:40:30