Python类成员详解:类变量、成员变量与方法解析 🐍
掌握Python面向对象编程的核心概念,让你的代码更加优雅高效!

在Python面向对象编程中,理解类变量、成员变量以及各种方法的区别至关重要。

本文将系统性地介绍这些概念,并通过实例代码展示它们的实际应用。


类变量 vs 成员变量

类变量 🏛️(房子)

  • 归属:归属于类本身,所有实例共享同一份
  • 定义位置:类内部但在所有方法之外
  • 访问方式类名.类变量(推荐)或实例.类变量

成员变量 🧑(住在房子中成员)

  • 归属:归属于实例,每个实例拥有独立副本
  • 定义位置:通常在__init__()方法中初始化
  • 访问方式:类内使用self.成员变量,类外使用实例.成员变量

类中不同方法

方法类型 修饰器 访问权限 典型用途
成员方法 可访问实例数据成员变量 操作实例状态
类方法 @classmethod 可修改类变量 类级别操作/替代构造函数
静态方法 @staticmethod 无特殊访问权限 工具函数

定义一个类

定义一个Employee类包含上面提到的元素:类变量、成员变量、成员方法、类方法、静态方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
class Employee:
# 类变量
raise_amount = 1.04 # 加薪幅度4%
num_of_emps = 0 # 员工总数

def __init__(self, first, last, pay):
# 成员变量初始化
self.first = first
self.last = last
self.pay = pay
self.email = f"{first}.{last}@company.com"

Employee.num_of_emps += 1 # 更新类变量

def fullname(self):
"""成员方法 - 访问实例数据"""
return f"{self.first} {self.last}"

def apply_raise(self):
"""成员方法 - 修改实例数据"""
self.pay = int(self.pay * self.raise_amount)

@classmethod
def set_raise_amount(cls, amount):
"""类方法 - 修改类变量"""
cls.raise_amount = amount

@classmethod
def from_string(cls, emp_str):
"""类方法作为替代构造函数"""
first, last, pay = emp_str.split('-')
return cls(first, last, int(pay))

@staticmethod
def is_workday(day):
"""静态方法 - 与类相关但不依赖类或实例"""
return day.weekday() < 5 # 周一到周五为工作日

变量的访问

  • 成员变量:只能通过实例访问
  • 类变量:通过类名或实例访问
1
2
3
4
5
6
7
# 创建实例
emp1 = Employee('John', 'Doe', 50000)
# 成员变量:只能通过实例访问
print(emp1.first) # 输出: John
# 类变量:通过类名或实例访问
print(Employee.raise_amount) # 输出: 1.04
print(emp1.raise_amount) # 输出: 1.04 (通过实例访问类变量)

方法的调用

成员方法

成员方法一般通过修改成员变量来控制实例状态,通过实例对象调用或通过类名将对象作为参数调用。

1
2
3
# 成员方法调用
print(emp1.fullname()) # 输出: John Doe
print(Employee.fullname(emp1)) # 输出: John Doe

类方法

类方法一般通过修改类变量来达到修改类状态的目标,类状态是类的所有实例共同拥有的状态(例如整个类的统计信息),通过类名调用。

1
2
3
# 类方法修改类变量
Employee.set_raise_amount(1.05)
print(Employee.raise_amount) # 输出: 1.05

同时类方法在Python中还有一个常用用途:用来替代构造函数,扩展构造函数的功能或提供更强大的批量构造能力,兼容多种格式的构造能力等。通过类名访问。

1
2
3
4
5
6
7
8
9
10
# 类方法作为替代构造函数
'''
@classmethod
def from_string(cls, emp_str):
"""类方法作为替代构造函数"""
first, last, pay = emp_str.split('-')
return cls(first, last, int(pay))
'''
emp2 = Employee.from_string('Jane-Doe-60000')
print(emp2.pay) # 输出: 60000

静态方法

静态方法一般与成员变量和类变量无关,只是一个工具类,在逻辑上归属于类或在类中常用放在类中比较合适,通过实例对象或类名都可调用,使用起来就和一般的函数一样。

1
2
3
4
# 静态方法调用
import datetime
print(Employee.is_workday(datetime.date(2025, 7, 25))) # 输出: True (星期五)
print(emp2.is_workday(datetime.date(2025, 7, 25))) # 实例也可以调用静态方法 # True

关键注意事项 ⚠️

  1. 变量查找顺序:Python会先查找实例命名空间,再查找类命名空间
  2. 类变量修改:通过实例修改类变量会创建实例变量副本,不会真正修改类变量(除非使用类方法)
  3. 方法选择指南
    • 需要访问实例数据 → 成员方法
    • 需要操作类状态 → 类方法
    • 独立工具函数 → 静态方法

通过合理使用这些类成员,可以构建出结构清晰、职责分明的Python类。希望这篇解析能帮助你更好地掌握Python面向对象编程!🚀