Python self与cls的区别深度解析
核心区别对比表
| 特性 | self (实例方法) | cls (类方法 @classmethod) |
|---|---|---|
| 代表对象 | 实例对象 (具体的某一个) | 类对象 (整个类别/图纸) |
| 第一个参数 | 接收调用该方法的实例 | 接收调用该方法的类 |
| 访问权限 | 访问实例属性 (self.name) 和 类属性 | 只能访问类属性 (cls.count) |
| 主要职责 | 处理具体业务逻辑,修改个体状态 | 修改全局状态、工厂模式创建实例 |
| 调用方式 | 通常通过 实例.方法() 调用 | 通常通过 类.方法() 调用 |
形象类比:汽车工厂
为了更直观地理解,我们可以把类想象成一个汽车工厂,把实例想象成造出来的汽车。
1. self (实例方法) —— 针对具体的车
- 场景:给车喷漆、踩油门、换轮胎。
- 逻辑:你必须先有一辆车(实例),才能做这些操作。你不能对着空气踩油门。
- 代码体现:
self.color = "Red"(把这一辆车喷红,不影响别的车)。
2. cls (类方法) —— 针对工厂/图纸
- 场景:修改出厂默认颜色、统计总共造了多少辆车、决定下一代车型的引擎规格。
- 逻辑:这些操作不需要具体的车,而是针对“生产线”或“设计图”的。
- 代码体现:
cls.default_color = "Blue"(以后造出来的所有新车默认都是蓝色)。
代码实战:看它们如何分工
1 | class Robot: |
为什么要区分得这么清楚?
1. 数据安全与隔离:
- 如果
work方法用cls写,那么一个机器人工作,所有机器人的电量都会减少,这显然不符合逻辑。 - 如果
change_battery_type用self写,那你必须先造出一个机器人才能改电池类型,而且改了之后可能只影响这一个机器人,也不符合逻辑。
2. 工厂模式(Factory Method):
cls还有一个神奇的能力:它知道它是谁。- 如果你有一个父类
Robot和一个子类FlyingRobot,当你调用FlyingRobot.create()时,cls会自动变成FlyingRobot。这样你就能用同一套代码创建不同种类的子类实例,而self做不到这一点(因为self必须在实例创建后才存在)。
总结
self是“我”:关注个体的喜怒哀乐(属性)。cls是“我们”:关注集体的规则和未来的规划。
当你需要操作具体数据时,用 self;当你需要操作全局配置或制造新个体时,用 cls。
All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.

