05
基础面向对象 · 1 / 5
5.1 类与实例:把数据和行为打包
💡 推理引擎 = 模型 + 配置 + 状态 + 方法,零散变量管不住,必须用类
5.1 类与实例
类 = 模板,实例 = 用模板造出来的具体对象
class InferenceEngine:
def __init__(self, model_path, device="cuda"):
self.model_path = model_path
self.device = device
self.loaded = False
def load(self):
self.loaded = True
return self
engine = InferenceEngine("qwen2.5-7b")
engine.load()
print(engine.model_path, engine.loaded) # qwen2.5-7b True
核心概念
class X:定义类(用 PascalCase,区别于函数)__init__是构造方法,创建实例时自动调用self是当前实例,访问属性 / 调用方法都通过它engine.loaded是实例属性,每个实例都有自己的
示范
class InferenceEngine:
def __init__(self, model_path, device="cuda"):
self.model_path = model_path
self.device = device
self.loaded = False
def load(self):
self.loaded = True
return f"loaded {self.model_path} on {self.device}"
eng = InferenceEngine("qwen2.5-7b")
print(eng.load())
✍️ 练习
定义一个类 Request:
__init__(self, prompt, max_tokens=512):存两个属性self.prompt和self.max_tokens- 一个方法
summary(self),返回f"Request(prompt={self.prompt!r}, max_tokens={self.max_tokens})"(用!r让 prompt 带引号显示)
创建两个实例,调用 summary() 并打印。
💡 思路提示
点开看提示
class 类名:类名通常大写开头__init__是初始化方法,self是必须的第一个参数{prompt!r}在 f-string 里等价于repr(prompt),会带引号
✅ 参考解法
写不出来再打开
class Request:
def __init__(self, prompt, max_tokens=512):
self.prompt = prompt
self.max_tokens = max_tokens
def summary(self):
return f"Request(prompt={self.prompt!r}, max_tokens={self.max_tokens})"
r1 = Request("hi")
r2 = Request("Tell me a story", max_tokens=1024)
print(r1.summary())
print(r2.summary())
🔍 进阶思考
想一下:没有 self 会怎样?
- 答:方法不知道在操作哪个实例,所有实例会共享同一份数据(bug)
class Bad:
x = 0
def set(self, v):
x = v # ❌ 这是局部变量,不是属性!
b = Bad()
b.set(10)
print(b.x) # 还是 0