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 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)
print(Employee.raise_amount) print(emp1.raise_amount)
|
方法的调用
成员方法
成员方法一般通过修改成员变量来控制实例状态,通过实例对象调用或通过类名将对象作为参数调用。
1 2 3
| print(emp1.fullname()) print(Employee.fullname(emp1))
|
类方法
类方法一般通过修改类变量来达到修改类状态的目标,类状态是类的所有实例共同拥有的状态(例如整个类的统计信息),通过类名调用。
1 2 3
| Employee.set_raise_amount(1.05) print(Employee.raise_amount)
|
同时类方法在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)
|
静态方法
静态方法一般与成员变量和类变量无关,只是一个工具类,在逻辑上归属于类或在类中常用放在类中比较合适,通过实例对象或类名都可调用,使用起来就和一般的函数一样。
1 2 3 4
| import datetime print(Employee.is_workday(datetime.date(2025, 7, 25))) print(emp2.is_workday(datetime.date(2025, 7, 25)))
|
关键注意事项 ⚠️
- 变量查找顺序:Python会先查找实例命名空间,再查找类命名空间
- 类变量修改:通过实例修改类变量会创建实例变量副本,不会真正修改类变量(除非使用类方法)
- 方法选择指南:
- 需要访问实例数据 → 成员方法
- 需要操作类状态 → 类方法
- 独立工具函数 → 静态方法
通过合理使用这些类成员,可以构建出结构清晰、职责分明的Python类。希望这篇解析能帮助你更好地掌握Python面向对象编程!🚀