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("模型已更新,日志系统已同步")
相关推荐
禾小西2 小时前
Java中使用正则表达式核心解析
java·python·正则表达式
yoyo_zzm2 小时前
JAVA (Springboot) i18n国际化语言配置
java·spring boot·python
小樱花的樱花2 小时前
C++ new和delete用法详解
linux·开发语言·c++
froginwe112 小时前
C 运算符
开发语言
APIshop2 小时前
Java获取京东商品详情接口(item_get)实战指南
java·linux·数据库
Mr.Entropy2 小时前
springboot2.x集成Flyway
java
disgare2 小时前
关于 spring 工程中添加 traceID 实践
java·后端·spring
李白的粉2 小时前
基于springboot+vue的旅游民宿管理系统
java·spring boot·vue·毕业设计·课程设计·源代码·旅游民宿管理系统
fengfuyao9852 小时前
低数据极限下模型预测控制的非线性动力学的稀疏识别 MATLAB实现
开发语言·matlab