Python 类全解析:静态方法、类方法、类变量

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