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("模型已更新,日志系统已同步")
相关推荐
阿童木写作30 分钟前
跨境电商图片翻译工具推荐:批量图片翻译+视频字幕翻译+智能抠图
python·macos·音视频·xcode
cui_ruicheng1 小时前
LangChain 应用开发(十四):Agent 上下文与记忆机制
服务器·人工智能·python·langchain
论迹复利1 小时前
FreeRTOS 在 RISC-V 上是如何“点火“的 —— 从 main() 到第一个任务的完整链路
java·开发语言·risc-v
circuitsosk1 小时前
任务规划器的三种范式对比:ReAct、Plan-and-Execute 与 Tree-of-Thought 在真实业务中的取舍
前端·javascript·python·react.js·llm·ai agent
张宇Joaquin2 小时前
鲲鹏统一并行加速库KUPL--众核并行能力介绍
java·开发语言·网络
736c2 小时前
C语言-数组 07
c语言·开发语言
shehuiyuelaiyuehao2 小时前
算法31,前缀和,可被k整除的子数组
数据结构·python·算法
宸津-代码粉碎机2 小时前
AI攻防战升级!基于Spring AI构建Java应用自动免疫安全体系
java·大数据·开发语言·人工智能·python·安全·spring
测试19982 小时前
如何用appium搭建Android自动化测试框架?
自动化测试·软件测试·python·测试工具·职场和发展·appium·测试用例
程序员大雄学编程2 小时前
微积分46. 无穷级数四大核心性质:从理论到实践的全方位解析
python·学习·微积分·学习工具