类方法 / 实例方法 / 静态方法
一、三种方法一眼分清
-
实例方法 Instance Method:第一个参数是
self,操作具体某个实例(访问/修改实例属性)。 -
类方法 Class Method:用
@classmethod装饰,第一个参数是cls,操作类本身(常用于工厂方法、备选构造器)。 -
静态方法 Static Method:用
@staticmethod装饰,没有self/cls,只是“借类这个命名空间放一个普通函数”。
生活化比喻:
- 实例方法 = 用“这台”咖啡机做一杯咖啡(
self就是这台具体机器)。
- 类方法 = 工厂按配方批量造机器(
cls是“咖啡机类”这个模具),返回一台新机器。
- 静态方法 = 贴在咖啡机旁的“清洗说明”,跟哪台机器都没关系,只是归类放这方便找。
二、关系图
classDiagram class CoffeeMachine { +brand +make(self) +from_config(cls) +clean() }
三、可运行代码示例
class CoffeeMachine:
def __init__(self, brand):
self.brand = brand
def make(self): # 实例方法:需要 self
return f"{self.brand} 煮了一杯咖啡"
@classmethod
def from_config(cls, brand): # 类方法:工厂,用 cls 造实例
return cls(brand)
@staticmethod
def clean(): # 静态方法:无 self/cls
return "冲水清洗即可"
m = CoffeeMachine("A")
print(m.make()) # A 煮了一杯咖啡
print(CoffeeMachine.from_config("B").brand) # B(用类调用工厂方法)
print(CoffeeMachine.clean()) # 冲水清洗即可(不需要实例)
四、对比速查表
| 实例方法 | 类方法 | 静态方法 | |
|---|---|---|---|
| 首个参数 | self | cls | 无 |
| 通常由谁调用 | 实例 | 类(也可实例) | 类或实例 |
| 能访问实例状态 | ✅ | ❌ | ❌ |
| 能访问类状态 | ✅(经 self.__class__) | ✅ | ❌ |
| 典型用途 | 行为/状态变更 | 工厂、备选构造器 | 工具函数 |
五、核心考点
-
@staticmethod与类方法本质区别在于有没有cls:静态方法完全不知道自己属于哪个类,类方法知道。 -
实例方法其实也能通过类调用,但必须手动传实例:
CoffeeMachine.make(m)等价于m.make()。 -
@classmethod做工厂很常见:如datetime.fromtimestamp()、dict.fromkeys()。 -
@staticmethod不会导致性能优势——它只是语法层面的“归属”,不要误以为能提速。
▶ 对应实操:14-TypedDict
速记卡(面试闪卡)
Q1:一句话讲清「类方法 / 实例方法 / 静态方法」到底是什么?
A:实例方法操作具体对象用 self,类方法用 @classmethod 和 cls 造实例,静态方法无 self/cls 只是归类函数。
Q2:一、三种方法一眼分清 —— 怎么理解?
A:咖啡机比喻最清:实例方法用”这台”机器做咖啡(self)、类方法按配方造机器(cls)、静态方法是贴墙清洗说明(Instance/Class/Static Method)。
Q3:三、可运行代码示例 —— 怎么理解?
A:代码三件套:def make(self) 实例方法、@classmethod def from_config(cls) 工厂、@staticmethod def clean() 工具函数,调用各不同(factory method 工厂方法)。
Q4:四、对比速查表 —— 怎么理解?
A:速查表记首参:实例 self、类 cls、静态无;实例/类方法能访状态,静态谁都不认;类方法做工厂、静态放工具(method resolution 方法解析)。
Q5:五、核心考点 —— 怎么理解?
A:核心考点四句:staticmethod 与类方法差在 cls;实例方法也能类调用但要手传 self;类方法做工厂支持多态;staticmethod 不提速(polymorphism 多态)。
Q6:核心速记主线有哪些?
-
首参不同:实例 self、类 cls、静态方法无参数
-
静态方法不认类、类方法认类;实例方法认具体对象
-
类方法 @classmethod 常做工厂/备选构造器(多态)
-
@staticmethod 只是命名空间归属,无性能优势
口诀
A:实例方法 self 认这台,类方法 cls 认这模;
静态方法谁都不认,借命名空间放工具;
类方法做工厂,子类调用返子类;
staticmethod 不提速,区别就在 cls 有无。
相关链接
-
📋 目录:00-Python
-
📚 学习清单:八股文学习路线图
-
🔗 面向对象三大特性 — 方法是封装的体现
-
🔗 __new__vs__init__ — 类方法与对象创建的联系
-
🔗 设计模式八股文 — 工厂模式常用类方法
-
🔗 操作系统八股文 — 方法与对象的运行模型