Python 类全解析:静态方法、类方法、类变量
★
“Python 是一门面向对象的语言。” 很多初学者看到这句话时,脑子里可能会冒出一个问号:“面向对象”到底是什么意思?类、对象、方法、变量,这些名词我应该怎么理解?”
今天这篇文章,我们就一次性把这些问题讲透,并顺便聊聊静态方法、类方法、类属性等开发中很容易混淆的概念,还会带你看一个实用的工厂模式案例。
1. 面向对象是什么?
简单说,面向对象编程(OOP)是一种编程思想,把代码组织成类(class)和对象(object)。
- 类:是对象的蓝图,相当于一份设计图。
- 对象:是类的实例,就像根据设计图造出来的实物。
📌 生活类比:
1 2 3 4 5 6 7 8 9
| class Person: def __init__(self, name): self.name = name
def say_hello(self): print(f"你好,我是 {self.name}")
p = Person("小王") p.say_hello() # 你好,我是 小王
|
2. 类属性(Class Attribute)
类属性是定义在类中、方法外的变量,它属于整个类,所有实例共享。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| class Dog: species = "Canis familiaris" # 类属性
def __init__(self, name): self.name = name
dog1 = Dog("小黑") dog2 = Dog("小白")
print(dog1.species) # Canis familiaris print(dog2.species) # Canis familiaris
Dog.species = "Canis lupus familiaris" print(dog1.species) # Canis lupus familiaris
|
⚠️ 注意:实例赋值会屏蔽类属性
1 2 3
| dog1.species = "哈士奇" print(dog1.species) # 哈士奇 print(dog2.species) # Canis lupus familiaris
|
3. 静态方法(@staticmethod)
静态方法定义在类里,但不依赖实例或类属性。
1 2 3 4 5 6
| class MathUtils: @staticmethod def add(a, b): return a + b
print(MathUtils.add(3, 5)) # 8
|
✅ 使用场景:
4. 类方法(@classmethod)
类方法以 cls 作为第一个参数,可以访问类属性,也可以创建实例。
1 2 3 4 5 6 7 8 9 10 11 12
| class Person: species = "Homo sapiens"
def __init__(self, name): self.name = name
@classmethod def from_string(cls, name_str): return cls(name_str.strip())
p = Person.from_string(" 小李 ") print(p.name) # 小李
|
✅ 使用场景:
5. 工厂模式(Factory Method)
工厂模式是一种创建对象的设计模式,把对象创建逻辑封装在类方法里,让实例化方式更灵活。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| class Shape: def __init__(self, width, height): self.width = width self.height = height
@classmethod def square(cls, side): return cls(side, side)
@classmethod def rectangle(cls, width, height): return cls(width, height)
# 创建不同形状 s1 = Shape.square(5) s2 = Shape.rectangle(4, 6)
print(s1.width, s1.height) # 5 5 print(s2.width, s2.height) # 4 6
|
好处:
- 隐藏复杂构造逻辑
- 提供更易理解的接口
- 扩展性好(增加新类型时不用改原构造函数)
6. 对比总结
| 类型 |
定义方式 |
第一个参数 |
可访问实例属性 |
可访问类属性 |
常见用途 |
| 实例方法 |
def func(self) |
self |
✅ |
✅ |
常规业务逻辑 |
| 类方法 |
@classmethod def func(cls) |
cls |
❌ |
✅ |
工厂方法、修改类属性 |
| 静态方法 |
@staticmethod def func() |
无 |
❌ |
❌ |
工具方法、逻辑分组 |
7. 简洁示意图
1 2 3 4 5 6 7 8 9 10 11 12 13
| ┌───────────────────────────┐ │ 类 │ │ ┌─────────────────────┐ │ │ │ 类属性(共享) │ │ │ └─────────────────────┘ │ │ ┌─────────────────────┐ │ │ │ 实例方法 self │──┼──▶ 操作对象数据 │ ├─────────────────────┤ │ │ │ 类方法 cls │──┼──▶ 操作类数据 / 创建实例 │ ├─────────────────────┤ │ │ │ 静态方法 (无self/cls)│──┼──▶ 独立工具逻辑 │ └─────────────────────┘ │ └───────────────────────────┘
|
💬 一句话记忆:
- 实例方法:操作对象数据
- 类方法:操作类数据,或充当工厂
- 静态方法:逻辑归类,不依赖类/对象
https://mp.weixin.qq.com/s/8PBsWpUEUR3xzRyMPIRYiA?scene=1