sqlor/aidocs/records.md
2025-10-05 11:24:24 +08:00

202 lines
4.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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