Class Variables vs Instance Variables in Python
Class Variables vs Instance Variables in Python
Description
Class variables and instance variables are two important types of variables in object-oriented programming. Class variables belong to the class itself and are shared by all instances; instance variables belong to individual instances, with each instance having its own copy. Understanding their differences, access methods, and precedence relationships is crucial for writing correct object-oriented code.
Problem-Solving Process
-
Basic Concept Differentiation
- Class Variable: Defined inside the class but outside any method, directly belonging to the class. All instances share the same class variable.
- Instance Variable: Typically defined inside methods (e.g.,
__init__), using theself.prefix. Each instance has an independent copy.
-
Example Definition
class Dog:
species = "Canis familiaris" # Class variable (all dogs belong to the same species)
def __init__(self, name, age):
self.name = name # Instance variable (each dog has its own name)
self.age = age # Instance variable (each dog has its own age)
-
Access Priority Rules
- When accessing attributes through an instance, Python searches in the following order:
- The instance's namespace
- The class's namespace
- The parent class's namespace (following MRO order)
- This means that if an instance variable and a class variable have the same name, the instance variable will "shadow" the class variable.
- When accessing attributes through an instance, Python searches in the following order:
-
Specific Operation Demonstration
# Create two instances
buddy = Dog("Buddy", 5)
miles = Dog("Miles", 3)
# Access instance variables (independent)
print(buddy.name) # "Buddy"
print(miles.name) # "Miles"
# Access class variables (shared)
print(buddy.species) # "Canis familiaris"
print(miles.species) # "Canis familiaris"
# Modify instance variables (does not affect other instances)
buddy.age = 6
print(buddy.age) # 6
print(miles.age) # 3 (remains unchanged)
# Modify class variables (affects all instances)
Dog.species = "Canis lupus"
print(buddy.species) # "Canis lupus"
print(miles.species) # "Canis lupus"
- Common Pitfall: Modifying Class Variables via Instances
# Misconception: Thinking this modifies the class variable
buddy.species = "New species"
# Actually, Python creates a new instance variable
print(buddy.species) # "New species" (instance variable)
print(miles.species) # "Canis lupus" (class variable, unchanged)
print(Dog.species) # "Canis lupus" (class variable, unchanged)
# Verification: Check each __dict__
print(buddy.__dict__) # {'name': 'Buddy', 'age': 6, 'species': 'New species'}
print(miles.__dict__) # {'name': 'Miles', 'age': 3}
- Correct Method for Modifying Class Variables
- Class variables should be modified through the class itself, not through instances.
- This ensures all instances see the change.
# Correct way
Dog.species = "Updated species"
print(buddy.species) # "New species" (still shadowed by instance variable)
print(miles.species) # "Updated species" (class variable updated)
# After deleting the instance variable, the class variable is visible again
del buddy.species
print(buddy.species) # "Updated species" (now showing class variable)
- Best Practice Recommendations
- Use meaningful naming conventions: Class variables often use all caps or more descriptive names.
- Avoid using the same name for instance and class variables.
- Always modify class variables via the class name to ensure consistent behavior.
- Use instance variables for instance-specific data and class variables for class-level shared data.