Python中的类方法和静态方法以及普通实例方法的区别

Python中的类方法和静态方法以及普通实例方法的区别

Python 中,类方法(@classmethod)和静态方法(@staticmethod)是两种常见的方法修饰符,它们与普通的实例方法不同。掌握它们有助于编写更加清晰、结构化、可复用的代码,在企业级开发中应用广泛。

Python 中的三种方法

方法类型 定义方式 作用 访问权限
实例方法 def method(self) 作用于​实例​,可以访问self 访问实例变量类变量
类方法 @classmethod def method(cls) 作用于​​,可以访问cls 访问​类变量​,但不能访问实例变量
静态方法 @staticmethod def method() 仅是​普通函数​,与类无直接关系 不能访问实例变量和类变量

实例方法(Instance Method)

📌 实例方法是最常见的方法,它属于某个对象(实例),可以访问实例变量 (self.attribute) 和类变量 (self.__class__.attribute)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Employee:
def __init__(self, name, salary):
self.name = name # 实例变量
self.salary = salary # 实例变量

def get_info(self): # 实例方法
return f"员工: {self.name}, 薪资: {self.salary}"

# 创建对象
emp1 = Employee("Alice", 5000)

# 调用实例方法
print(emp1.get_info()) # ✅ 输出: 员工: Alice, 薪资: 5000

🔹 特点

🟢需要 self 作为第一个参数,指向当前实例。
🟢只能通过对象调用,不能直接用类调用。
🟢可以访问实例变量,也可以访问类变量。

类方法(@classmethod)

📌 类方法作用于类,而非实例,可以访问和修改类变量,但无法访问实例变量。使用 @classmethod 装饰器,并且第一个参数 cls 代表类本身。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Employee:
company = "Tech Corp" # 类变量

def __init__(self, name, salary):
self.name = name
self.salary = salary

@classmethod
def set_company(cls, new_name):
cls.company = new_name # 修改类变量

@classmethod
def get_company(cls):
return cls.company

# 调用类方法
print(Employee.get_company()) # ✅ Tech Corp
Employee.set_company("NewTech")
print(Employee.get_company()) # ✅ NewTech

🔹 特点

🟢需要 @classmethod 装饰器,第一个参数 cls 代表类本身。
🟢通过 cls 访问和修改类变量,而不能访问实例变量。
🟢可以通过类调用,也可以通过实例调用:

1
2
emp = Employee("Bob", 4000)
print(emp.get_company()) # ✅ 也能调用

静态方法(@staticmethod)

📌 静态方法独立于类和实例,只是类中的一个普通函数,它不会访问 selfcls,因此不能访问实例变量和类变量。使用 @staticmethod 装饰器,不需要 selfcls

1
2
3
4
5
6
7
8
class MathUtils:
@staticmethod
def add(x, y):
return x + y

# 直接通过类名调用
print(MathUtils.add(3, 5)) # ✅ 输出: 8

🔹 特点

🟢需要 @staticmethod 装饰器。
🟢不能访问 selfcls,即不能访问实例变量或类变量。
🟢既可以通过类名调用,也可以通过实例调用:

1
2
math_util = MathUtils()
print(math_util.add(4, 6)) # ✅ 输出: 10

三者的对比

方法类型 self cls 访问实例变量 访问类变量 适用场景
实例方法 需要操作实例数据
类方法 需要操作类数据(如修改类变量)
静态方法 与实例和类无关的工具方法

企业实战案例

🔹 通过类方法创建对象

📌 在企业开发中,我们通常需要不同的方式创建对象,例如从数据库、JSON 文件等获取数据。这时可以使用 @classmethod 作为工厂方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Employee:
def __init__(self, name, salary):
self.name = name
self.salary = salary

@classmethod
def from_string(cls, emp_str):
name, salary = emp_str.split("-")
return cls(name, int(salary)) # 通过类方法创建对象

# 通过类方法创建对象
emp = Employee.from_string("Alice-6000")
print(emp.name, emp.salary) # ✅ Alice 6000

🔹 统计实例个数(类方法)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Employee:
count = 0 # 统计员工数量

def __init__(self, name):
self.name = name
Employee.count += 1

@classmethod
def get_count(cls):
return cls.count

# 创建多个员工
emp1 = Employee("Alice")
emp2 = Employee("Bob")

# 获取员工总数
print(Employee.get_count()) # ✅ 2

🔹 使用静态方法实现日期校验

📌 在企业开发中,我们可能需要一些通用工具函数,如日期校验。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

from datetime import datetime

class DateUtils:
@staticmethod
def is_valid_date(date_str):
try:
datetime.strptime(date_str, "%Y-%m-%d")
return True
except ValueError:
return False

# 调用静态方法
print(DateUtils.is_valid_date("2024-03-31")) # ✅ True
print(DateUtils.is_valid_date("2024-02-30")) # ✅ False

什么时候用类方法 vs 静态方法?

场景 类方法(@classmethod) 静态方法(@staticmethod)
需要访问/修改类变量
需要创建对象的工厂方法
只执行独立逻辑,不访问类或实例
需要访问实例变量

结论

✅ 实例方法(self):操作实例数据,访问实例变量。
✅ 类方法(cls):操作类数据,访问和修改类变量。
✅ 静态方法(无 selfcls):工具函数,与实例和类无关。

💡 企业级开发建议

🟢需要修改类变量 ➝ 用 @classmethod
🟢工具方法,不依赖类和实例 ➝ 用 @staticmethod
🟢操作实例变量 ➝ 用普通方法


Python中的类方法和静态方法以及普通实例方法的区别
https://dreamshao.github.io/2025/03/31/python类方法和静态方法/
作者
Yun Shao
发布于
2025年3月31日
许可协议