python中的@Property和@Setter

文章目录

看llama-index的settings代码时,没太看懂,因而有此一问。

为什么要用@Property和@Setter呢?

主要是为了解决3个问题。
原因一:为了"伪装"和"省事" (API 更优雅)
原因二:为了实现"懒加载" (省内存)
原因三:为了"中间商赚差价" (逻辑控制)

原因一:为了"伪装"和"省事" (API 更优雅)

不使用@Property和@Setter,代码:

python 复制代码
# 如果没有装饰器,你得这样写(很啰嗦!)
Settings.set_llm(DashScope(...))
model = Settings.get_llm()

但是用了 @property 和 @setter,你就可以写得像操作普通变量一样简单:

python 复制代码
# 用了装饰器,看起来就像在操作普通变量(很清爽!)
Settings.llm = DashScope(...)
model = Settings.llm
原因二:为了实现"懒加载" (省内存)
python 复制代码
@property
def llm(self) -> LLM:
    if self._llm is None:  # 如果还没初始化
        self._llm = resolve_llm("default") # 才去创建对象
    return self._llm
原因三:为了"中间商赚差价" (逻辑控制)

@setter 允许你在赋值的时候,偷偷插入一些"检查逻辑"。

虽然 LlamaIndex 的源码里写得比较简单,但在实际开发中,@setter 经常用来做这种事:

python 复制代码
@llm.setter
def llm(self, llm):
    # 1. 先检查一下:你给我的这个东西是合法的模型吗?
    if not isinstance(llm, BaseLLM):
        raise TypeError("你给我的是个啥?必须是 LLM 对象!")
    
    # 2. 再赋值
    self._llm = llm
    
    # 3. 顺便触发个副作用:比如告诉日志系统,"嘿,模型换了"
    print("模型已更新,日志系统已同步")
相关推荐
牛油果子哥q10 分钟前
【C++ const 】全场景深度精讲:修饰规则、底层常量折叠、指针 / 引用 / 成员函数实战、易错坑点与工程代码实现
开发语言·c++
闪电悠米13 分钟前
黑马点评-Redisson-02_reentrant_lock
java·spring boot·redis·分布式·缓存
云烟成雨TD17 分钟前
Spring AI Alibaba 1.x 系列【67】ReactAgent SSE 流式输出
java·人工智能·spring
天天进步201523 分钟前
Python全栈项目--社区问答平台
开发语言·python·django
我登哥MVP29 分钟前
Spring Boo从“会用”到“精通”:Spring Boot 入门
java·spring boot·后端·spring·maven·intellij-idea·mybatis
skywalk816330 分钟前
Tree-sitter是一个解析器生成器工具和一个增量解析库。它可以为源文件构建具体的语法树,并在编辑源文件时有效地更新语法树
开发语言·编程
染翰34 分钟前
Java 实现 Git 自动克隆工具,打包成 Windows 独立 EXE(免安装JDK)
java·git·后端
噜噜噜阿鲁~38 分钟前
python学习笔记 | 12.0、错误、调试和测试
笔记·python·学习
AI视觉网奇41 分钟前
Bambu Studio 发现 xx个开放边
开发语言·人工智能·python
七老板的blog42 分钟前
多阶段 AI 评测流水线架构设计与实践
java·人工智能·spring