Class Variables vs. Instance Variables in Python
In Python, variables that belong to a class or its instances are categorized into two types: class variables and instance variables. Both types of variables serve different purposes, and understanding the distinction between them is essential for writing effective object-oriented code.
1. Instance Variables
Instance variables are variables that are associated with a specific instance (or object) of a class. Each instance of the class has its own copy of the instance variables.
- Scope: Instance variables belong to an instance of the class, meaning each object has its own set of instance variables.
- Creation: Instance variables are typically defined within the
__init__()
method of the class and are prefixed withself
, which refers to the current instance of the class. - Access: Instance variables are accessed using
self
, e.g.,self.variable_name
.
Example:
class Person:
def __init__(self, name, age):
self.name = name # Instance variable
self.age = age # Instance variable
# Creating instances of the class
person1 = Person("Alice", 30)
person2 = Person("Bob", 25)
# Accessing instance variables
print(person1.name) # Output: Alice
print(person2.name) # Output: Bob
In this example:
name
andage
are instance variables. EachPerson
object (likeperson1
andperson2
) has its own copy of these variables.
2. Class Variables
Class variables are variables that are shared by all instances of the class. They are defined within the class but outside of any instance methods (such as __init__()
). All instances of the class share the same value for a class variable.
- Scope: Class variables are associated with the class itself, not with individual instances.
- Creation: Class variables are typically defined at the class level, not inside the
__init__()
method. - Access: Class variables can be accessed using either the class name or an instance of the class.
Example:
class Person:
species = "Homo sapiens" # Class variable
def __init__(self, name, age):
self.name = name # Instance variable
self.age = age # Instance variable
# Creating instances of the class
person1 = Person("Alice", 30)
person2 = Person("Bob", 25)
# Accessing class variable via class name
print(Person.species) # Output: Homo sapiens
# Accessing class variable via instance
print(person1.species) # Output: Homo sapiens
print(person2.species) # Output: Homo sapiens
In this example:
species
is a class variable. Bothperson1
andperson2
share the same value forspecies
.- The class variable
species
can be accessed using both the class name (Person.species
) and the instance name (person1.species
).
3. Key Differences Between Class and Instance Variables
Feature | Instance Variables | Class Variables |
---|---|---|
Definition | Defined inside instance methods (e.g., __init__() ). |
Defined inside the class but outside methods. |
Scope | Unique to each instance of the class. | Shared among all instances of the class. |
Access | Accessed using self (e.g., self.variable ). |
Accessed using the class name or an instance (e.g., ClassName.variable or self.variable ). |
Default Value | Different for each instance. | The same for all instances unless modified. |
Modification | Can be modified independently for each instance. | Changes to a class variable are reflected across all instances. |
4. Example with Modifying Class Variables
class Car:
# Class variable
wheels = 4
def __init__(self, make, model):
# Instance variables
self.make = make
self.model = model
# Creating instances
car1 = Car("Toyota", "Camry")
car2 = Car("Honda", "Civic")
# Accessing class variable
print(car1.wheels) # Output: 4
print(car2.wheels) # Output: 4
# Modifying the class variable through the class
Car.wheels = 3
# Accessing class variable again after modification
print(car1.wheels) # Output: 3
print(car2.wheels) # Output: 3
Here:
- The class variable
wheels
is shared across all instances. - When
Car.wheels
is modified, bothcar1
andcar2
reflect the new value (3
), because the class variable is shared among all instances.
5. Best Practices
- Use class variables for shared data: When you have data that should be common across all instances of the class, use class variables. For example, constants, counters, or properties that are common to all objects of a class.
- Use instance variables for unique data: When you need each instance to have its own data (like the name or age of a person), use instance variables.
- Avoid modifying class variables via instances: While you can access and modify class variables through instances, it's generally a good practice to modify them via the class itself for clarity.
6. Summary
- Instance variables are unique to each instance of a class and are defined within methods (like
__init__()
). - Class variables are shared by all instances of a class and are defined at the class level.
By understanding when to use instance variables and when to use class variables, you can better manage the data in your objects and ensure that your classes behave as expected.