4.9 KiB
4.9 KiB
Records 类技术文档
概述
Records 是一个用于管理记录集合的 Python 类,它允许将字典形式的数据转换为指定类的实例,并提供统一的存储与迭代访问机制。默认情况下,记录会被转换为 DictObject 实例(来自 appPublic.dictObject 模块),但支持自定义类作为数据容器。
该类适用于需要动态处理结构化数据的场景,如数据库查询结果、API 响应数据等。
依赖
from appPublic.dictObject import DictObject
DictObject:一个字典式对象封装类,允许通过属性访问字典键值(例如obj.name而非obj['name'])。- 若未安装或找不到此模块,请确保
appPublic包已正确安装并可导入。
类定义
class Records:
def __init__(self, klass=DictObject):
self._records = []
self.klass = klass
构造函数 __init__
参数:
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
klass |
type |
DictObject |
用于将每条记录转换成的对象类型。必须是一个可调用类型(通常是类),接受关键字参数初始化。 |
功能:
- 初始化一个空的记录列表
_records。 - 设置用于实例化每条记录的目标类
klass。
示例:若
klass=MyDataClass,则每条记录会以MyDataClass(**record_dict)的方式创建。
方法说明
add(rec)
向记录集合中添加一条新记录。
参数:
| 参数名 | 类型 | 说明 |
|---|---|---|
rec |
dict |
一个字典类型的记录数据,键对应目标类的初始化参数。 |
行为:
- 使用
self.klass(**rec)将字典rec实例化为指定类的对象。 - 将生成的对象追加到内部列表
self._records中。
异常:
- 若
rec不是字典或其键不匹配klass所需参数,可能抛出TypeError或其他初始化异常。
示例:
records = Records()
records.add({"name": "Alice", "age": 30})
# 等效于: obj = DictObject(name="Alice", age=30)
get()
获取当前所有记录的列表。
返回值:
list:包含所有已添加记录对象的列表,顺序与添加一致。
示例:
all_records = records.get()
for r in all_records:
print(r.name)
__iter__()
使 Records 实例成为可迭代对象。
返回值:
- 返回自身实例(实现了
__next__的迭代器协议)。
内部行为:
- 初始化迭代器状态变量:
self.start = 0self.end = len(self._records)
注意:此实现不是线程安全的,且不支持嵌套循环中的并发迭代(因为状态保存在实例上)。
__next__()
实现迭代器协议的下一步方法。
返回值:
- 当还有未遍历记录时,返回下一个记录对象。
- 遍历完成后,抛出
StopIteration异常以终止迭代。
逻辑流程:
if self.start < self.end:
返回 self._records[self.start] 并递增索引
else:
抛出 StopIteration
示例用法:
for record in records:
print(record)
使用示例
示例 1:使用默认 DictObject
from appPublic.dictObject import DictObject
from your_module import Records
records = Records()
records.add({"id": 1, "name": "Product A"})
records.add({"id": 2, "name": "Product B"})
for r in records:
print(r.id, r.name)
# 输出:
# 1 Product A
# 2 Product B
示例 2:使用自定义类
class User:
def __init__(self, name, email):
self.name = name
self.email = email
def __repr__(self):
return f"<User {self.name} ({self.email})>"
users = Records(klass=User)
users.add({"name": "Bob", "email": "bob@example.com"})
users.add({"name": "Charlie", "email": "charlie@example.com"})
print(users.get())
# 输出: [<User Bob (bob@example.com)>, <User Charlie (charlie@example.com)>]
注意事项
-
非线程安全
__iter__和__next__将迭代状态(start,end)存储在实例上,因此多个同时进行的迭代会导致状态冲突。 -
不可重入迭代
在一次迭代未完成前再次调用iter()会覆盖原有状态。建议改用iter(records.get())获取独立迭代器。 -
性能提示
get()返回的是原始列表引用,修改该列表会影响内部状态。如需保护数据,建议返回副本:return self._records[:] -
扩展建议
可考虑实现__len__、__getitem__支持更多序列操作,例如:def __len__(self): return len(self._records) def __getitem__(self, idx): return self._records[idx]
版本历史
| 版本 | 修改内容 |
|---|---|
| 1.0 | 初始版本,支持基本记录管理与迭代功能 |
许可证
请参考项目整体许可证文件。