如何在实际开发中选择使用类变量和实例变量?

📅 2026/6/29 17:40:02
如何在实际开发中选择使用类变量和实例变量?
一、核心选择准则一句话判断只要是所有实例共用、不会随单个对象变化的数据 → 用类变量只要是每个对象独有的、彼此不一样的数据 → 必须用实例变量。二、什么时候优先用【类变量】1. 全局固定常量、配置类数据所有实例取值完全相同不会单独修改某个实例的该字段。 示例接口地址、超时时间、默认分页条数、统一状态码、地区常量、类描述。python运行class OrderService: # 类变量全局统一配置 DEFAULT_TIMEOUT 30 PAY_GATEWAY_URL https://pay.xxx.com def __init__(self, order_no): self.order_no order_no优势只存一份内存大量实例节省内存初始化更快。2. 统计类、全局计数器统计当前类一共创建了多少个实例、全局请求次数。python运行class User: total_count 0 def __init__(self): User.total_count 13. 类级别的缓存、全局共享容器慎用所有实例需要共用一份缓存字典、连接池对象。 ⚠️ 注意多线程场景要手动加锁防止并发错乱。4. 枚举、类型标记比如订单类型、用户角色枚举全项目统一不变。类变量使用避坑不要通过实例.变量 xxx赋值会生成实例变量破坏共享设计 修改类变量统一用类名.变量 xxx。三、什么时候必须用【实例变量】1. 每个对象独有属性姓名、手机号、订单号、价格、创建时间、用户 ID 等每个实例值都不一样。python运行class User: def __init__(self, name, phone): self.name name self.phone phone2. 会被单个实例单独修改的数据某个对象要独立修改属性不能影响其他实例。 比如用户余额、商品库存、临时状态标记。3. 可变对象list/dict且需要数据隔离如果用类变量存列表A 实例 append 会影响所有实例大概率产生 Bug这种场景一定要用实例变量python运行# 错误写法 class Order: goods_list [] # 正确写法 class Order: def __init__(self): self.goods_list []4. 业务上需要对象销毁时自动释放的数据实例被回收实例变量自动释放减少全局常驻内存占用。四、特殊场景怎么选场景 1默认值大部分实例相同少量实例自定义用类变量当默认值需要自定义时在实例覆盖python运行class Goods: default_status 1 def __init__(self): # 大部分商品用默认状态不用赋值 pass g1 Goods() g2 Goods() g2.default_status 2 # 仅当前商品修改场景 2需要序列化、ORM 映射数据库字段ORM 模型Django/Flask-SQLAlchemy中表字段声明写在类上类变量用来做表结构映射每行记录的数据存在实例变量中。场景 3工具类、工具方法封装工具类没有实例属性全部配置、常量使用类变量甚至可以直接用类方法调用不用实例化。五、选择决策流程图这个数据是不是所有实例完全一样是 → 类变量是否允许一个实例修改后其他实例同步看到变化是 → 类变量否 → 实例变量是不是列表、字典这类可变容器大部分情况用实例变量全局缓存 / 连接池才用类变量 加锁对象销毁后该数据是否需要释放需要释放 → 实例变量需要全局常驻 → 类变量六、开发最佳实践常量全大写命名统一放在类顶部作为类变量便于统一维护实例变量统一在__init__中初始化不要随意在业务方法中动态新增海量实例场景公共配置放类变量减少内存占用可变容器优先实例变量避免无意修改全局数据类变量尽量通过类名访问减少属性向上查找的微小性能损耗实例特别多且属性固定使用__slots__优化实例变量内存。七、常见错误案例错误 1可变对象当类变量存默认值python运行class Student: tags [] def __init__(self, name): self.name name s1 Student(张三) s1.tags.append(优秀) s2 Student(李四) print(s2.tags) # [优秀] 被污染✅ 正确在__init__里初始化列表为实例变量。错误 2把独有业务字段定义成类变量会导致所有实例数据互相覆盖。需要我整理一份面试高频场景选型速记表吗