文章目录
看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("模型已更新,日志系统已同步")