Skip to main content

How to Add Attributes to Objects in Python

Dynamically adding attributes to objects is a useful technique in Python, especially for creating flexible data structures.

This guide explores several methods to add attributes to objects, including using setattr(), dot notation, for loops, and the SimpleNamespace class.

Adding Attributes with setattr()

The setattr() function provides a dynamic way to add or modify attributes of an object:

class Employee():
def __init__(self, name):
self.name = name

emp1 = Employee('tom')

setattr(emp1, 'salary', 100)
setattr(emp1, 'age', 25)

print(getattr(emp1, 'salary')) # Output: 100
print(getattr(emp1, 'age')) # Output: 25
print(getattr(emp1, 'name')) # Output: tom
  • setattr() takes the object, attribute name (as a string) and the value as arguments, and sets or adds the attribute to the object.
  • The getattr() method retrieves the value of the attribute, in the above code sample getattr is used to get the value of salary and age on the emp1 object, as well as its existing attribute name.

Creating a Generic Object

If you need a generic object that you can add attributes to, you can use the pass statement in a class definition:

class GenericClass():
pass

obj1 = GenericClass()

setattr(obj1, 'salary', 100)
setattr(obj1, 'age', 25)

print(getattr(obj1, 'salary')) # Output: 100
print(getattr(obj1, 'age')) # Output: 25
  • Instances of this class will have a __dict__ attribute, and you will be able to add new attributes to the object.
  • Remember that the built-in object class does not have __dict__ and you should avoid inheritance from object if you need dynamic attributes.

Adding Attributes with Dot Notation

You can also use dot notation for adding attributes, which is functionally equivalent to setattr():

class GenericClass():
pass

obj1 = GenericClass()
obj1.salary = 100
obj1.age = 25

print(getattr(obj1, 'salary')) # Output: 100
print(getattr(obj1, 'age')) # Output: 25
print(obj1.salary) # Output: 100
print(obj1.age) # Output: 25

  • While this syntax is shorter than setattr(), it can cause linting warnings if the attributes are defined outside of the __init__() method.

Adding Multiple Attributes with a Loop

To add multiple attributes from a dictionary, iterate using a for loop:

class GenericClass():
pass

my_dict = {'name': 'tomnolan', 'age': 25}
obj1 = GenericClass()

for key, value in my_dict.items():
setattr(obj1, key, value)

print(getattr(obj1, 'name')) # Output: tomnolan
print(getattr(obj1, 'age')) # Output: 25

  • The for loop iterates through all the key-value pairs in the dictionary.
  • The setattr() function then assigns a value to the attribute specified by the key.

Adding Attributes Using SimpleNamespace

The types.SimpleNamespace class provides a way to create a generic object to which you can add attributes, which is particularly useful when creating generic objects:

from types import SimpleNamespace

obj1 = SimpleNamespace()

setattr(obj1, 'salary', 100)
setattr(obj1, 'language', 'Python')

print(getattr(obj1, 'salary')) # Output: 100
print(getattr(obj1, 'language')) # Output: Python
print(obj1) # Output: namespace(salary=100, language='Python')
  • You create a SimpleNamespace object using SimpleNamespace().
  • You can use the setattr() to add the attributes to the object.

You can also create a SimpleNamespace object with attributes during initialization:

from types import SimpleNamespace

obj1 = SimpleNamespace(name='tom', age=25)

setattr(obj1, 'salary', 100)
setattr(obj1, 'language', 'Python')

print(getattr(obj1, 'salary')) # Output: 100
print(getattr(obj1, 'language')) # Output: Python
print(getattr(obj1, 'name')) # Output: tom
print(getattr(obj1, 'age')) # Output: 25
print(obj1) # Output: namespace(name='tom', age=25, salary=100, language='Python')