推理基础设施 · Python5.3 实例方法、静态方法、类方法
05
基础面向对象 · 3 / 5

5.3 实例方法、静态方法、类方法

💡 推理框架工具类里三种方法都常见,签名区别要看清

5.3 实例方法 / 静态方法 / 类方法

三种方法

类型 装饰器 第一个参数 用途
实例方法 (无) self 操作实例数据
类方法 @classmethod cls 工厂方法、获取类级别的配置
静态方法 @staticmethod (无) 纯工具函数
class InferenceEngine:
    DEFAULT_BACKEND = "vllm"

    def __init__(self, model_path):
        self.model_path = model_path

    def load(self):                       # 实例方法
        return f"loading {self.model_path}"

    @classmethod
    def default(cls):                     # 类方法(工厂)
        return cls(model_path="default-model")

    @staticmethod
    def estimate_memory(params_b):        # 静态方法(纯函数)
        return params_b * 2  # GB

示范

class InferenceEngine:
    DEFAULT_BACKEND = "vllm"

    def __init__(self, model_path):
        self.model_path = model_path

    @classmethod
    def default(cls):
        return cls(model_path="default-model")

eng = InferenceEngine.default()
print(eng.model_path)                  # default-model
print(InferenceEngine.DEFAULT_BACKEND) # vllm

✍️ 练习

定义类 TokenizerStats

  • 类属性 VOCAB_SIZE = 32000
  • 实例属性 name(在 __init__ 里接受一个参数 name)
  • 实例方法 describe(self),返回 f"{self.name}: vocab={TokenizerStats.VOCAB_SIZE}"
  • 类方法 from_name(cls, name),返回一个实例(其实就是 cls(name)
  • 静态方法 approx_tokens(text),返回 len(text.split())

测试:

t = TokenizerStats.from_name("qwen")
print(t.describe())
print(TokenizerStats.approx_tokens("hello world how are you"))

💡 思路提示

点开看提示
  1. @classmethod 装饰的方法第一个参数是 cls(不是 self
  2. @staticmethod 装饰的方法没有 selfcls,纯函数
  3. 类属性通过 类名.属性名 访问,instance.describe() 里也能用

✅ 参考解法

写不出来再打开
class TokenizerStats:
    VOCAB_SIZE = 32000

    def __init__(self, name):
        self.name = name

    def describe(self):
        return f"{self.name}: vocab={TokenizerStats.VOCAB_SIZE}"

    @classmethod
    def from_name(cls, name):
        return cls(name)

    @staticmethod
    def approx_tokens(text):
        return len(text.split())

t = TokenizerStats.from_name("qwen")
print(t.describe())
print(TokenizerStats.approx_tokens("hello world how are you"))

🔍 进阶思考

经验法则:

  • 能写成独立函数就别塞进类(静态方法用得不多)
  • 类方法最常见用法就是“另一种构造方式”(alternate constructor)
  • 推理框架里很多 Config.from_yaml(path)Model.from_pretrained(name) 都是类方法