Get All Object Attributes in Python
Introduction
In Python, everything is an object - from integers and strings to classes and functions. This may seem odd, especially for primitive types like numbers, but even those have attributes, like real
and imag
. Each object has its own attributes, which are basically juset properties or characteristics that help define the object.
In this Byte, we will explore different ways to get all attributes of an object in Python, and how to display and manipulate them effectively.
Viewing Object Attributes
To start with, let's look at how we can view the attributes of an object in Python. Python provides a built-in function, dir()
, which returns a list of all attributes and methods of an object, which also includes those inherited from its class or parent classes.
Consider a simple class, Company
, with a few attributes:
class Company:
def __init__(self, name, industry, num_employees):
self.name = name
self.industry = industry
self.num_employees = num_employees
Now, let's create an instance of Company
and use dir()
to get its attributes:
c = Company('Dunder Mifflin', 'paper', 15)
print(dir(c))
This will output:
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'industry', 'num_employees', 'name']
As you can see, dir()
returns not only the attributes we defined (i.e. name
, industry
, num_employees
), but also a list of special methods (also known as dunder methods) inherent to all Python objects.
Getting their Values
Now that we know how to get the attributes of an object, let's see how to also extract their values. Python provides a built-in function, getattr()
, which allows us to get the value of a specific attribute.
Here's how you can use getattr()
:
name = getattr(c, 'name')
print(name)
This will output:
Dunder Mifflin
In this example, getattr()
returns the value of the name
attribute of the Company
instance c
. If the attribute does not exist, getattr()
will raise an AttributeError
. However, you can provide a third argument to getattr()
, which will be returned if the attribute is not found, thus avoiding the error:
location = getattr(c, 'location', 'Not available')
print(location)
This will output:
Not available
In this case, since location
is not an attribute of c
, getattr()
returns the provided default value, 'Not available'.
Using __dict__ to get Properties and Values
In Python, every object is equipped with a __dict__
attribute. This built-in attribute is a dictionary that maps the object's attributes to their respective values. This can be very handy when we want to extract all properties and values of an object. Let's see how it works.
class TestClass:
def __init__(self):
self.attr1 = 'Hello'
self.attr2 = 'World'
instance = TestClass()
print(instance.__dict__)
When you run the above code, it will output:
{'attr1': 'Hello', 'attr2': 'World'}
Note: __dict__
does not return methods of an object, only the properties and their values.
Formatting Object Attributes into Strings
Sometimes you may want to format the attributes of an object into a readable string for display or logging purposes. Python's built-in str
function can be overridden in your class to achieve this. Here's how you can do it:
class TestClass:
def __init__(self):
self.attr1 = 'Hello'
self.attr2 = 'World'
def __str__(self):
return str(self.__dict__)
instance = TestClass()
print(str(instance))
When you run the above code, it will output:
"{'attr1': 'Hello', 'attr2': 'World'}"
Employing vars()
for Attribute Extraction
Another way to extract attributes from an object in Python is by using the built-in vars()
function. This function behaves very similar to the __dict__
attribute and returns the __dict__
attribute of an object. Here's an example:
class TestClass:
def __init__(self):
self.attr1 = 'Hello'
self.attr2 = 'World'
instance = TestClass()
print(vars(instance))
When you run the above code, it will output:
{'attr1': 'Hello', 'attr2': 'World'}
Note: Like __dict__
, vars()
also does not return methods of an object, only the properties and their values.
Conclusion
Getting all of the attributes of an object in Python can be achieved in several ways. Whether you're using dir()
, the __dict__
attribute, overriding the str
function, or using the vars()
function, Python provides a variety of tools to extract and manipulate object attributes.