1. 理解Python变量体系的基础框架
Python作为一门面向对象编程语言,其变量体系设计体现了优雅的抽象层次。类变量和实例变量这对概念,看似简单却经常让中级开发者陷入困惑。我在实际代码审查中发现,约40%的类设计问题都源于对这两种变量作用域的误解。
先看一个典型场景:假设我们开发电商系统时需要创建商品类。类变量适合存储所有商品共有的属性(如平台佣金率),而实例变量则记录每个商品特有的属性(如价格、库存)。这种设计不仅符合业务逻辑,更能有效节省内存——类变量在内存中只保存一份,被所有实例共享。
python复制class Product:
platform_fee = 0.15 # 类变量:所有商品共享
def __init__(self, price, stock):
self.price = price # 实例变量:每个商品独有
self.stock = stock
关键理解:类变量属于类本身,实例变量属于具体对象。就像建筑图纸(类)和实际房屋(实例)的关系——图纸上的标注影响所有房屋,而每栋房屋的内部装修各自独立。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 类变量与实例变量的本质区别
2.1 存储位置与生命周期
类变量存储在类的__dict__中,而实例变量存储在实例的__dict__里。通过内置的vars()函数可以直观看到这种差异:
python复制print(vars(Product)) # 输出类命名空间
# {'platform_fee': 0.15, ...}
iphone = Product(5999, 100)
print(vars(iphone))
# {'price': 5999, 'stock': 100}
内存分配示意图:
code复制类内存区
┌─────────────┐
│ Product │
│ platform_fee│
└─────────────┘
▲
│ 引用
实例内存区
┌─────────────┐
│ iphone │
│ price │
│ stock │
└─────────────┘
2.2 访问优先级机制
当通过实例访问属性时,Python按照MRO(方法解析顺序)查找:
- 先在实例自身
__dict__查找 - 没找到则到类
__dict__查找 - 还没找到则到父类查找
这种机制导致一个经典陷阱:
python复制class Counter:
count = 0 # 类变量
def __init__(self):
self.count += 1 # 实际创建了实例变量!
c1 = Counter()
print(c1.count) # 输出1
print(Counter.count
