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("模型已更新,日志系统已同步")
相关推荐
BING_Algorithm2 分钟前
JDBC核心教程
java·后端·mysql
京师20万禁军教头3 分钟前
33面向对象(中级)-object类详解
java
一个小浪吴啊3 分钟前
重构 AI 编程流:基于 Hermes 记忆中枢与 OpenCode 执行终端的 Harness 工程化实践
java·人工智能·opencode·harness·hermes
Lyyaoo.9 分钟前
【JAVA网络面经】应用层协议
java·开发语言·网络
morethanilove10 分钟前
小程序-添加粘性布局
开发语言·前端·javascript
kongba00710 分钟前
vibe coding的测试架构设计提示词V1.0
python
無限進步D13 分钟前
Java 面向对象高级 继承
java·开发语言
云烟成雨TD15 分钟前
Spring AI Alibaba 1.x 系列【37】ReactAgent 构建、执行流程分析
java·人工智能·spring
qq_2837200516 分钟前
2026 最新 Python+AI 零基础入门实战教程:从零搭建企业级人工智能项目
人工智能·python·#机器学习·#python #ai零基础·#大模型开发·#rag·#ai避坑
贵沫末20 分钟前
Python——图像处理项目Conda环境搭建
开发语言·python·conda