继承Langchain类时super初始化问题
我正在尝试写一个名为 LLM 的类,如下所示:
from langchain_openai import ChatOpenAI
class LLM:
def __init__(self,model_name):
super().__init__(model_name=model_name)
self.model_name = model_name
class OpenAILLM(LLM,ChatOpenAI):
def __init__(self,model_name):
super().__init__(model_name=model_name)
self.model_name = model_name
这个类运行得很好,但当我尝试在 OpenAILLM
类的 __init__
方法中添加另一个变量时,如下所示:
from langchain_openai import ChatOpenAI
class LLM:
def __init__(self,model_name):
super().__init__(model_name=model_name)
self.model_name = model_name
class OpenAILLM(LLM,ChatOpenAI):
def __init__(self,model_name):
super().__init__(model_name=model_name)
self.model_name = model_name
self.var = 'var'
创建 OpenAILLM
对象时失败,并出现错误 ValueError: "OpenAILLM" object has no field "var"
有没有人能帮我看看怎么添加更多变量呢?
我还尝试了下面定义的 get_var
函数,它可以正常工作,但下面定义的 set_var
函数却出现了和上面一样的错误。
from langchain_openai import ChatOpenAI
class LLM():
var = 1
def __init__(self,model_name):
super().__init__(model_name=model_name)
self.model_name = model_name
class OpenAILLM(LLM,ChatOpenAI):
def __init__(self,model_name):
super().__init__(model_name=model_name)
self.model_name = model_name
def get_var(self):
return self.var
def set_var(self, var):
print('self var',self.var)
self.var = var
return True
OpenAILLM 的 mro 如下:
(__main__.OpenAILLM,
__main__.LLM,
langchain_openai.chat_models.base.ChatOpenAI,
langchain_core.language_models.chat_models.BaseChatModel,
langchain_core.language_models.base.BaseLanguageModel,
langchain_core.runnables.base.RunnableSerializable,
langchain_core.load.serializable.Serializable,
pydantic.v1.main.BaseModel,
pydantic.v1.utils.Representation,
langchain_core.runnables.base.Runnable,
typing.Generic,
abc.ABC,
object)
我觉得这可能和 pydantic 有关,但我不太确定。我也不知道该怎么解决。请帮帮我。
1 个回答
1
在类 OpenAILLM
上定义了一个 __slots__
属性(这个是 Pydantic 的,我不太熟悉)。
你可以查看这个链接了解 __slots__
是怎么工作的:https://docs.python.org/3/reference/datamodel.html#slots。
简单来说,如果一个类定义了 __slots__
,那么这个类的成员就固定了,你不能在它的直接实例上添加新的成员。而且我认为 ChatOpenAI
不是为了被继承的,所以最好不要这样使用。