推理基础设施 · Python5.1 类与实例:把数据和行为打包
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.promptself.max_tokens
  • 一个方法 summary(self),返回 f"Request(prompt={self.prompt!r}, max_tokens={self.max_tokens})"(用 !r 让 prompt 带引号显示)

创建两个实例,调用 summary() 并打印。

💡 思路提示

点开看提示
  1. class 类名: 类名通常大写开头
  2. __init__ 是初始化方法,self 是必须的第一个参数
  3. {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