1. 基本概念
类属性 (Class Attribute)
- 属于类本身的属性,而不是类的某个实例
- 所有实例共享同一个类属性
- 定义在类内部,但在任何方法之外
- 通常用于存储类级别的数据或常量
实例属性 (Instance Attribute)
- 属于类的单个实例(对象)的属性
- 每个实例有自己独立的副本
- 通常在__init__方法中定义
- 用于存储对象特有的数据
2. 代码示例
class Dog:
# 类属性
species = "Canis familiaris"
count = 0 # 用于跟踪创建的Dog实例数量
def __init__(self, name, age):
# 实例属性
self.name = name
self.age = age
Dog.count += 1 # 修改类属性
# 使用示例
buddy = Dog("Buddy", 5)
miles = Dog("Miles", 3)
print(buddy.name) # 输出: Buddy (实例属性)
print(miles.name) # 输出: Miles (实例属性)
print(Dog.species) # 输出: Canis familiaris (类属性)
print(buddy.species) # 输出: Canis familiaris (通过实例访问类属性)
print(Dog.count) # 输出: 2 (我们创建了两个Dog实例)
3. 关键区别
特性 | 类属性 | 实例属性 |
定义位置 | 类内部,方法外部 | 通常在__init__方法中 |
存储位置 | 类命名空间 | 实例命名空间 |
访问方式 | 类名.属性 或 实例.属性 | 只能通过实例.属性 |
共享性 | 所有实例共享 | 每个实例独立 |
修改影响 | 影响所有实例 | 只影响当前实例 |
典型用途 | 常量、计数器、共享配置 | 对象特有的数据 |
4. 注意事项
- 访问优先级:当实例属性和类属性同名时,实例访问会优先返回实例属性
class Example:
attr = "类属性"
def __init__(self):
self.attr = "实例属性"
e = Example()
print(e.attr) # 输出: "实例属性"
修改类属性:必须通过类名修改,通过实例修改会创建新的实例属性
Dog.species = "New species" # 正确修改类属性
buddy.species = "Another" # 这会创建一个实例属性,不影响类属性
可变类属性:当类属性是可变对象(如列表)时要特别小心,因为所有实例共享同一个对象
5. 最佳实践
- 使用类属性存储类级别的数据和常量
- 使用实例属性存储对象特有的状态
- 避免使用可变对象作为类属性,除非你确实需要共享状态
- 命名约定:常量形式的类属性通常使用全大写(如MAX_OBJECTS)
希望这个讲解对你有帮助!如果有任何问题,请随时提问。