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"))
💡 思路提示
点开看提示
@classmethod装饰的方法第一个参数是cls(不是self)@staticmethod装饰的方法没有self、cls,纯函数- 类属性通过
类名.属性名访问,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)都是类方法