Skip to main content

How to Access and Update Class Variables in Python

In Python, class variables are shared among all instances of a class. They are defined directly within the class, outside of any instance methods (like __init__).

This guide explains how to define, access, and update class variables, and highlights the key differences between class variables and instance variables.

Defining and Accessing Class Variables​

Class variables are defined directly within the class body:

class Employee():
cls_id = 'employee' # Class variable

def __init__(self, name, salary):
self.name = name # Instance variable
self.salary = salary # Instance variable
  • cls_id: This is a class variable. It's associated with the Employee class itself, not with any specific Employee object.
  • self.name, self.salary: These are instance variables. Each Employee object will have its own copy of these.

You can access class variables using the class name:

print(Employee.cls_id) # Output: employee

Updating Class Variables​

Updating via the Class​

The most straightforward way to update a class variable is to access it directly through the class name:

print(Employee.cls_id) # Output: employee
Employee.cls_id = 'new_employee_id' # Update the class variable
print(Employee.cls_id) # Output: new_employee_id

This change will be reflected in all instances of the class (and in the class itself), because they all share the same class variable.

Updating via a Class Method​

It's often better practice to update class variables through @classmethods. This provides a clear and controlled way to modify class-level state:

class Employee():
cls_id = 'employee'

def __init__(self, name, salary):
self.name = name
self.salary = salary
@classmethod
def set_cls_id(cls, new_cls_id): # Use "cls" by convention
cls.cls_id = new_cls_id # Update via the class reference.
return cls.cls_id
  • A class method receives the class itself (conventionally named cls) as the first argument.
  • The @classmethod decorator is used to indicate the method defined is a class method.
  • You can then call this method like this: Employee.set_cls_id('another_id').

Updating via an Instance (and why it's tricky)​

You can technically access and even "modify" a class variable through an instance:

tom = Employee('tomnolan', 100)
print(tom.cls_id) # Output: employee (accessing via instance)
tom.cls_id = 'new' # This creates an *instance* variable!
print(tom.cls_id) # Output: new (instance variable)
print(Employee.cls_id) # Output: new_employee_id (class variable unchanged!)
  • The line tom.cls_id = 'new' created an instance variable, because when using dot notation on an instance, you are always modifying or accessing an instance variable.

To access the class variable from the instance use:

class Employee():
cls_id = 'employee'

def __init__(self, name, salary):
self.name = name
self.salary = salary
tom = Employee('tomnolan', 100)
result = type(tom).cls_id # or tom.__class__.cls_id
print(result) # Output: employee
  • This code demonstrates the correct way to access the class variable from an instance, if you really need to. type(tom) (or tom.__class__) gets the class of the instance, and then you access cls_id on the class.

Accessing Instance Variables​

Instance variables are unique to each object:

class Employee():
cls_id = 'employee' # class variable
def __init__(self, name, salary):
self.name = name # instance variables
self.salary = salary

def set_name(self, new_name): # Method to modify an instance variable.
self.name = new_name
return new_name

alice = Employee('Alice', 150) # Create instances with unique attributes.
tom = Employee('tomnolan', 100)

tom.set_name('tomnolan2') # Modify only tom's name.
print(tom.name) # Output: tomnolan2

print(alice.name) # Output: Alice (alice is not modified)
  • Instance variables can be accessed inside the class methods using self.
  • Class variables can be accessed inside the class methods using cls.

Accessing Class Variables from Instances​

You can use type(instance) or instance.__class__ to get a reference to the class from an instance:

class Employee():
cls_id = 'employee'

def __init__(self, name, salary):
self.name = name
self.salary = salary

tom = Employee('tomnolan', 100)

# Accessing the class variable through the instance's class:
print(type(tom).cls_id) # Output: employee
print(tom.__class__.cls_id) # Output: employee
  • Both type(tom) and tom.__class__ will return the class object.