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("模型已更新,日志系统已同步")
相关推荐
huaiixinsi几秒前
Canal + Outbox、Kafka 选型与高可用、Caffeine 底层原理总结
java·数据库·分布式·mysql·spring·adb·kafka
海盗1234几秒前
C#中使用MiniExcel 快速入门:读写 .xlsx 文件
开发语言·windows·c#
Ting-yu1 分钟前
SpringCloud快速入门(11)---- Sentinel(异常处理)
java·spring boot·后端·spring·spring cloud·sentinel
X56611 分钟前
什么是Bootstrap的移动优先响应式设计
jvm·数据库·python
XMYX-01 分钟前
29 - Go time 时间模块详解:时间处理、定时控制与底层设计
开发语言·golang
m0_470857641 分钟前
实现一个可精确定位、支持左右移动与删除的文本光标系统
jvm·数据库·python
小小de风呀2 分钟前
de风——【从零开始学C++】(七):string类详解
开发语言·c++·算法
丘比特惩罚陆3 分钟前
制作类似aimlab的测试手速反应力的小游戏
开发语言·javascript·visual studio
m0_591364734 分钟前
mysql如何通过索引减少行锁范围_mysql索引与加锁逻辑
jvm·数据库·python
江屿风4 分钟前
【c++笔记】类和对象流食般投喂(中)
开发语言·c++·笔记