Python is a popular programming language, known for its simplicity and versatility. It offers a broad range of built-in functions and libraries, designed to simplify and speed up programming tasks.
Among the built-in functions in Python is the dir()
method. The dir()
method returns a list of attributes and methods of an object or a module.
In this article, we will explore the basics of the dir()
method, including the optional argument object
and the behavior of the dir()
method for objects with defined __dir__()
method. We will also provide some examples to help beginners understand how dir()
works.
Basic concept of dir()
method:
The dir()
method is a built-in function in Python that returns a list of attributes and methods of an object or a module. It can be used to determine the available methods and attributes of an object or a module, providing programmers with a snapshot of a particular object’s or module’s properties.
The syntax for the dir()
method is as follows:
dir([object])
1) The optional argument object
:
The object
argument in the above syntax is optional. If the object
argument is not provided, the dir()
method will return a list of names in the current local scope.
If a module object is passed as an argument, the dir()
function will return the names of the attributes and methods available in the module.
2) Behavior of dir()
method for objects with defined __dir__()
method:
Python also allows objects to define their own __dir__()
method, which is called when the dir()
method is invoked on that object.
The __dir__()
method should return a list of attributes and methods of the object. If an object has a defined __dir__()
method, the dir()
method will call that method instead of its built-in implementation.
This means that the behavior of dir()
can be customized for objects with a defined __dir__()
method.
Python dir()
Example:
Now let’s see some examples of how the dir()
method works.
Empty dir()
:
If you call the dir()
method without passing any object, it will return a list of names in the current local scope. For example:
>>> dir()
['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__']
List initialization:
If you want to find out what attributes and methods are available for a list object, you can pass that object as an argument to the dir()
method.
For example:
>>> my_list = []
>>> dir(my_list)
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
Dictionary initialization:
Similarly, to find out what attributes and methods are available for a dictionary object, you can pass the dictionary object as an argument to the dir()
method. For example:
>>> my_dict = {}
>>> dir(my_dict)
['__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values']
3) Working with the dir()
Method in Python
When working with the dir()
function in Python, there are two types of objects that a programmer may encounter: custom objects with undefined __dir__()
and objects with defined __dir__()
.
Custom Objects with Undefined __dir__()
If you are using custom objects in your Python code, it is possible that these objects may not have a defined __dir__()
method. In this case, the dir()
method will return a list of valid attributes and methods that can be accessed from the object.
For example, let’s consider a simple custom object called “Person”:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
This object does not have a defined __dir__()
method, so when calling the dir()
method on an instance of the Person class, Python will return the default list of attributes and methods for Python objects:
>>> p = Person("John", 30)
>>> dir(p)
['__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__', 'age', 'name']
As we can see, the dir()
function returns not only the attributes that we have defined but also the built-in attributes of a Python object.
Objects with Defined __dir__()
If an object has a defined __dir__()
method, the dir()
method will use the custom implementation provided by the object instead of the default Python implementation. By defining the __dir__()
method, the object’s author can control which attributes and methods are included in the list of results returned by the dir()
method.
Here is an example that shows how to define a __dir__()
method for a custom object:
class Custom:
def __init__(self):
self.list = [1, 2, 3]
def __dir__(self):
return ['list', 'print_list']
def print_list(self):
print(self.list)
In this example, we define the Custom class with an __init__()
method that initializes an instance variable list
, and a method called print_list
that simply prints out the content of the list. We then define the __dir__()
method that returns a list of the attributes and methods that we want to expose in our Custom object.
Now if we create an instance of Custom and call dir()
on it, we should see only the attributes and methods that we exposed in the __dir__()
function:
>>> c = Custom()
>>> dir(c)
['list', 'print_list']
As we can see, the dir()
method returns only the list
and print_list
attributes, which are the ones that we defined in the __dir__()
method.
4) Example 1: Custom Objects
Let’s consider another example to illustrate how the dir()
method works with custom objects:
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
def study(self):
print('The student is studying.')
def sleep(self):
print('The student is sleeping.')
In this example, we create a simple Student class that has two attributes: name
and age
, and two methods: study()
and sleep()
.
Let’s create a Student object and see what dir()
returns:
>>> s = Student('John', 20)
>>> dir(s)
['__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__', 'age', 'name', 'sleep', 'study']
As expected, dir()
returns all the attributes and methods of the Student class as well as the default Python attributes and methods. We can now create a __dir__()
method for the Student class:
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
def study(self):
print('The student is studying.')
def sleep(self):
print('The student is sleeping.')
def __dir__(self):
return [attr for attr in dir(self) if not callable(getattr(self, attr))]
s = Student('John', 20)
dir(s)
In this example, we define the __dir__()
method for the Student class. This implementation returns only the non-method attributes of the Student class, thus excluding the study()
and sleep()
methods from the output of the dir()
function.
5) Example 2: Defined __dir__()
We can also define __dir__()
method for built-in classes such as str
, int
, and float
.
Here’s an example:
class MyInt(int):
def __dir__(self):
return [attr for attr in dir(int) if not callable(getattr(int, attr))]
i = MyInt(5)
dir(i)
In this example, we define the MyInt
class that inherits from the int
class. We then define the __dir__()
method for the MyInt
class, which returns a list of attributes of the built-in int
class.
Finally, we create an instance of the MyInt
class and call the dir()
method on it. The output will only show the non-method attributes of the built-in int
class, which are also available in the MyInt
class.
This is just an example to show how you can use the __dir__()
method to extend the functionalities of built-in classes in Python. In practice, you can define __dir__()
methods for your custom classes, allowing programmers to narrow the output of dir()
method and remove the clutter from methods that should not be exposed outside the object.
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
self.z = self.get_z()
def get_z(self):
return self.x + self.y
def __dir__(self):
return ['x', 'y', 'z']
p = Point(1, 2)
dir(p)
In this example, we define a class called Point
that has three attributes: x
, y
, and z
. The z
attribute is assigned the result of calling the get_z()
method.
We then define the __dir__()
method that returns only the x
, y
, and z
attributes. Finally, we create an instance p
of the Point
class and call the dir()
method on it.
The output will only show the attributes that we have defined in the __dir__()
method.
Conclusion:
The dir()
method is a powerful tool in Python that provides a simple way to explore and examine the attributes and methods of an object.
It is particularly useful for inspecting custom objects and modules when you are not sure about their contents. In this article, we provided an overview of the Python dir()
method, including its basic concept, optional arguments, and the behavior of dir()
method for objects with defined __dir__()
method.
We also provided two examples to illustrate how the dir()
method works with custom objects, including custom classes with defined __dir__()
and built-in classes extended by __dir__()
. By mastering the dir()
method in Python, you can perform more sophisticated programming tasks with ease, probe deeper into the structure and contents of objects, and optimize your Python code.
If you have any questions or comments about the Python dir()
method, feel free to share them in the comments section below.
7) References
In writing this article, we have relied on several sources to provide a comprehensive overview of the Python dir()
method. These sources include:
- The official Python documentation: The official documentation provides a clear and detailed explanation of how the
dir()
method works, its syntax, and its purpose. It also includes examples to illustrate how to usedir()
to explore objects and modules in Python. - Python for Data Science Handbook: This book by Jake VanderPlas provides an in-depth discussion of the Python language and its various features, including
dir()
. - Python Tricks: The Book: This book by Dan Bader includes several tips and tricks on how to use Python effectively, including a chapter on the
dir()
method that provides insight into its practical applications and use cases. - Learn Python the Hard Way: This book by Zed Shaw includes a practical approach to learning Python and includes a section on the
dir()
method that provides a thorough discussion of its purpose, syntax, and practical use cases. - Real Python: This online resource provides a range of tutorials, articles, and courses on Python, including a section on the
dir()
method. The articles cover topics such as defining__dir__()
method and exploring custom objects withdir()
.
By consulting these sources, we were able to provide a comprehensive and informative article on the Python dir()
method, covering both the basics as well as more advanced topics. We encourage our readers to explore these sources to deepen their knowledge of Python and its many features.
In summary, the Python dir()
method is a built-in function that returns a list of attributes and methods of an object or a module. It is a powerful tool that allows programmers to explore and examine the attributes and methods of an object, particularly custom objects and modules.
By defining the __dir__()
method, the object’s author can control which attributes and methods are included in the output of dir()
. Additionally, the ability to define __dir__()
methods for built-in classes allows programmers to extend the functionalities of Python’s built-in classes.
Overall, the knowledge of the Python dir()
method is a crucial part of coding in Python, and mastering it can lead to more efficient and effective programming practices.