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

一、三种方法一眼分清

  • 实例方法 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())             # 冲水清洗即可(不需要实例)
 

四、对比速查表

实例方法类方法静态方法
首个参数selfcls
通常由谁调用实例类(也可实例)类或实例
能访问实例状态
能访问类状态✅(经 self.__class__
典型用途行为/状态变更工厂、备选构造器工具函数

五、核心考点

  1. @staticmethod 与类方法本质区别在于有没有 cls:静态方法完全不知道自己属于哪个类,类方法知道。

  2. 实例方法其实也能通过类调用,但必须手动传实例:CoffeeMachine.make(m) 等价于 m.make()

  3. @classmethod 做工厂很常见:如 datetime.fromtimestamp()dict.fromkeys()

  4. @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 有无。

相关链接

相关链接