Функция dir() в Python

Это исчерпывающее руководство по применению функции dir() в Python. Вы узнаете, как вызвать эту функцию на любом объекте и, что более важно, как проанализировать полученный результат. Кроме того, вы узнаете, где вам чаще всего пригодится функция dir().

Скачивайте книги ТОЛЬКО на русском языке у нас в телеграм канале: PythonBooksRU

Знакомство с функцией dir()

В Python функция dir() возвращает список атрибутов и методов, принадлежащих объекту. Это может быть полезно для изучения и обнаружения возможностей объекта, а также для отладки и тестирования.

Например, давайте составим список атрибутов, связанных со строкой Python:

# List the attributes and methods of a string
dir('Hello')

Вывод:

['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isascii', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']

В результате вы получите полный список всех методов и атрибутов, связанных с типом данных str в Python. Если вы уже имели дело со строками, вы можете увидеть знакомые методы, такие как split, join или upper.

Что такое функция dir() в Python?

Функция dir() в Python перечисляет атрибуты и методы объекта. Она принимает объект в качестве аргумента и возвращает список строк, которые являются именами его атрибутов и методов. Использование функции dir() может быть полезно для изучения объектов, чтобы лучше понять, что они делают.

Например, при помощи dir() можно вывести атрибуты встроенного типа данных, такого как список или словарь. Или можно применить эту функцию для пользовательского класса, чтобы посмотреть, что в нем находится. Кроме того, с помощью функции dir() можно изучить плохо документированный модуль или библиотеку.

Синтаксис и параметры

Синтаксис функции dir() в Python следующий:

dir(object)

Функция dir() принимает один параметр – объект, атрибуты которого вас интересуют. Это может быть объект любого типа, например, встроенный тип данных, такой как список или словарь, или определяемый пользователем класс.

Функция возвращает список строк, которые представляют методы и атрибуты данного объекта.

Примеры

Вызовем функцию dir() для строки ‘Hello’:

# List the attributes and methods of a string
print(dir('Hello'))

Вывод:

['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isascii', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']

В результате получим список, содержащий все атрибуты и методы строкового объекта.

Например, метод upper() можно использовать для преобразования строки в верхний регистр, а метод find() – для поиска подстроки в строке. Оба эти метода принадлежат классу string и поэтому присутствуют в выводе функции dir().

Обратите внимание, что функцию dir() можно вызвать для любого объекта в Python, а не только для встроенных типов, таких как string. То есть вы можете перечислить атрибуты, которыми обладает ваш пользовательский класс. Далее вы найдете больше примеров на эту тему.

Что собой представляют методы с двойным подчеркиванием?

В предыдущем примере в выводе вы видели множество методов, начинающихся с двойного подчеркивания. Например, __add__ или __class__.

Методы с двойным подчеркиванием, которые появляются в выводах функции dir(), в Python называются “магическими”. Это специальные методы, которые определяются самим языком Python. Они используются для реализации некоторых встроенных свойств объектов.

Например, метод __len__(), возвращающий длину объекта, вызывается, когда вы используете функцию len() на объекте. Метод __add__() вызывается при использовании оператора + между двумя объектами и возвращает результат операции.

Магические методы иногда считаются продвинутой концепцией Python. Вы можете использовать их для настройки поведения пользовательских объектов. Например, с их помощью можно указать, что делать с объектом вашего пользовательского класса при вызове + на нем. Для этого нужно указать метод __add__ в классе.

Магические методы не предназначены для прямого вызова. Они автоматически вызываются интерпретатором Python при выполнении определенных операций над объектом.

Примечание редакции. О том, что такое методы в принципе, читайте в статье “Методы в Python”.

Но давайте вернемся к нашей теме.

Использование dir() для проверки классов и экземпляров

Функция dir() полезна, если вы хотите проверить атрибуты классов и их экземпляров.

Когда вы используете dir() с классом, она перечисляет атрибуты, определенные в классе, включая любые унаследованные атрибуты и методы от суперклассов класса.

В предыдущих примерах вы вызывали функцию dir() для экземпляра строки Python. Но вы можете вызвать ее на любом другом экземпляре класса, включая созданные вами пользовательские классы. Более того, вы можете вызывать функцию dir() непосредственно на классе, а не на его экземпляре.

Вот пример использования функции dir() для проверки атрибутов и методов только что созданного пользовательского класса:

class MyClass:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def my_method(self):
        return self.x + self.y

print(dir(MyClass))

Вывод:

['__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__', 'my_method']

В этом примере есть пользовательский класс MyClass, который имеет методы __init__() и my_method(). Вызов функции dir() возвращает большой список строк. Это все атрибуты пользовательского класса MyClass.

Самым последним в этом списке идет my_method. Это метод, который мы определили в MyClass. Обратите внимание, что переменные x и y отсутствуют. Это потому, что вы вызвали функцию dir() на классе, а не на его экземпляре. Переменные экземпляра создаются при инстанцировании объектов.

В качестве другого примера давайте вызовем dir() на экземпляре класса, а не на классе:

class MyClass:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def my_method(self):
        return self.x + self.y

my_instance = MyClass(1, 2)
print(dir(my_instance))

Вывод:

['__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__', 'my_method', 'x', 'y']

Опять же, в конце списка вы можете увидеть атрибут my_method. Но на этот раз, поскольку вы вызвали dir() на экземпляре, вы также увидите переменные x и y.

Где пригодится функция dir()?

Функция dir() в Python служит для выяснения атрибутов объекта. Это полезно, когда вы работаете с незнакомым объектом или когда просто хотите увидеть все доступные методы объекта.

Еще одно распространенное применение функции dir() – знакомство с атрибутами и методами в определенном модуле или пакете.

Например, чтобы узнать, какие атрибуты и методы доступны в модуле math, вызовите dir():

import math
print(dir(math))

Так вы получите полный список атрибутов и методов модуля math. Это полезно для быстрого поиска функций и других объектов, доступных в модуле, и может сэкономить вам время при работе с незнакомым модулем. Это особенно актуально, если модуль плохо документирован (в отличие от модуля math).

Заключение

В заключение следует отметить, что функция dir() – это ценный инструмент в Python, позволяющий узнать, какие атрибуты и методы доступны для данного объекта. Ее можно использовать для быстрого изучения новых объектов и модулей, а также для экономии времени при работе с незнакомым объектом или модулем.

Спасибо за внимание. Успешного кодинга!

Перевод статьи Artturi Jalli “The dir() Function in Python: A Complete Guide (with Examples)”