
В Python каждый класс содержит набор методов, доступных для вызова через объекты или сам класс. Быстро определить их можно с помощью встроенной функции dir(), которая возвращает полный список атрибутов, включая методы, указывая как стандартные, так и пользовательские. Для фильтрации именно методов удобно сочетать dir() с callable(), исключая свойства и переменные.
Для анализа внешних библиотек полезно применять функцию inspect.getmembers() из модуля inspect. Она позволяет получать пары «имя – объект», фильтруя по inspect.isfunction или inspect.ismethod. Такой подход обеспечивает точное определение всех функций класса, включая статические и классовые методы, что особенно важно при работе с фреймворками и сторонними модулями.
Если требуется интерактивная проверка во время разработки, удобно использовать IPython или Jupyter Notebook: автодополнение через Tab мгновенно показывает методы объекта. Также можно комбинировать __dict__ и vars() для выявления методов, добавленных динамически, что помогает при рефакторинге кода и отслеживании изменений в сложных проектах.
Использование функции dir() для получения списка методов
Функция dir() возвращает список всех атрибутов объекта, включая методы и свойства. Она особенно полезна для быстрого анализа класса без необходимости изучать исходный код.
Для примера создадим простой класс:
class Sample:
def method1(self): pass
def method2(self): pass
Вызов dir(Sample) выдаст полный перечень имен, включая встроенные методы Python, такие как __init__ и __str__, а также пользовательские методы method1 и method2.
Результат можно отфильтровать, оставив только пользовательские методы. Для этого используют генератор списков:
[m for m in dir(Sample) if callable(getattr(Sample, m)) and not m.startswith('__')]
Функция dir() также эффективна при работе с экземплярами классов. Например, dir(Sample()) покажет методы, доступные конкретному объекту, что полезно для интерактивной отладки.
Таблица ниже показывает разницу между полным списком dir() и отфильтрованным вариантом для класса Sample:
| Метод | Тип |
|---|---|
| __init__ | встроенный |
| __str__ | встроенный |
| method1 | пользовательский |
| method2 | пользовательский |
Использование dir() в сочетании с callable() и фильтрацией позволяет быстро ориентироваться в структуре классов и выявлять только те методы, которые реально могут быть вызваны.
Фильтрация методов с помощью встроенной функции callable()

В Python функция callable() позволяет проверить, можно ли вызвать объект как функцию. Это особенно полезно при работе с классами, где на объекте могут быть методы, атрибуты и свойства.
Для фильтрации методов класса сначала получают все атрибуты через dir(). Например, dir(MyClass) возвращает список строк с именами всех элементов класса, включая методы и переменные.
Далее применяется callable() к каждому атрибуту с помощью функции getattr(). Это позволяет исключить все обычные свойства и оставить только вызываемые объекты:
[name for name in dir(MyClass) if callable(getattr(MyClass, name))] – такой подход дает список только методов, игнорируя переменные класса.
При этом важно учитывать наследуемые методы. callable() отрабатывает одинаково на методах базовых классов, что помогает быстро выявить весь функционал, доступный объекту.
Если необходимо исключить «магические» методы, их легко отфильтровать по шаблону имен, оставляя только методы с конкретными префиксами и без двойного подчеркивания.
Таким образом, комбинация dir() и callable() обеспечивает точное разделение методов и атрибутов, минимизируя ошибки при автоматической обработке объектов класса.
Просмотр только публичных методов класса

Простейший способ получить список публичных методов:
- Вызвать
dir(ИмяКласса)для получения всех атрибутов. - Отфильтровать элементы, которые не начинаются с
_. - Использовать
callable(), чтобы оставить только функции.
Пример реализации в одну строку:
[m for m in dir(МойКласс) if callable(getattr(МойКласс, m)) and not m.startswith('_')]
Этот метод работает с любыми классами, включая наследуемые. Если метод переопределен в подклассе, фильтр по _ автоматически исключает защищенные и приватные функции.
Для интерактивного анализа удобно использовать inspect.getmembers() с фильтром predicate=inspect.isfunction и дополнительной проверкой имени, что упрощает получение читаемого списка публичных методов без лишних данных.
Для получения списка методов класса вместе с их типами данных в Python можно использовать встроенную функцию dir() в сочетании с getattr() и type(). Например, перебирая все атрибуты класса через for attr in dir(MyClass) и проверяя callable(getattr(MyClass, attr)), вы выделяете именно методы, исключая свойства и поля.
Если требуется различать методы экземпляра, классовые методы и статические методы, полезно использовать inspect: inspect.getmembers(MyClass, predicate=inspect.isfunction) возвращает функции, inspect.ismethod – методы экземпляров, а isroutine объединяет функции и методы для полной проверки.
Использование inspect.getmembers() для анализа класса

Функция inspect.getmembers() из стандартного модуля inspect предназначена для детального извлечения содержимого класса: методов, атрибутов, свойств и унаследованных элементов. В отличие от dir(), она возвращает структурированные данные в виде пар (имя, объект), что позволяет сразу работать с реальными объектами, а не только со строками.
При анализе класса inspect.getmembers() автоматически учитывает цепочку наследования, поэтому в результат попадают не только методы, определённые в самом классе, но и унаследованные. Это особенно полезно при исследовании поведения сложных иерархий, где часть логики скрыта в базовых классах и миксинах.
Для фильтрации методов обычно используется второй аргумент – предикат. Например, передача callable позволяет отобрать только вызываемые объекты, а inspect.isfunction или inspect.ismethod помогают разделить функции класса и связанные методы экземпляра. Такой подход исключает ручную проверку типов и снижает риск логических ошибок.
inspect.getmembers() возвращает элементы в отсортированном по имени виде, что удобно для генерации документации или автоматического сравнения версий классов. Благодаря этому можно стабильно анализировать изменения API, не опасаясь случайного изменения порядка элементов.
Важно учитывать, что функция извлекает и «служебные» атрибуты, включая __init__, __dict__ и __module__. Для практического анализа рекомендуется явно исключать имена, начинающиеся и заканчивающиеся двойным подчёркиванием, если цель – изучение только пользовательских методов.
При работе с динамически создаваемыми классами inspect.getmembers() отражает текущее состояние объекта на момент вызова. Это позволяет диагностировать проблемы, связанные с метапрограммированием, декораторами классов и подменой методов во время выполнения.
Использование inspect.getmembers() оправдано в инструментах отладки, автогенерации тестов и анализаторах кода, где требуется точное понимание структуры класса без выполнения его методов. Функция не вызывает методы и не изменяет состояние объекта, что делает её безопасной для статического анализа.
Отображение методов экземпляра и класса отдельно

Практичный способ выделить методы экземпляра – анализировать объект через dir() с последующей фильтрацией по наличию связанного экземпляра. Методы, возвращаемые как bound method, указывают на привязку к конкретному объекту. Проверка через callable() и атрибут __self__ позволяет отсеять функции, которые не используют экземпляр. Такой подход особенно полезен при интроспекции сложных объектов с наследованием.
Для отображения методов класса стоит работать напрямую с объектом класса, а не с его экземпляром. Методы, помеченные декоратором @classmethod, можно выявлять через getattr() и проверку типа функции. Дополнительно имеет смысл исключать методы, унаследованные от базовых классов, сравнивая __dict__ текущего класса с MRO-цепочкой.
- Использовать dir(экземпляр) для первичного списка методов экземпляра
- Фильтровать bound methods по наличию __self__
- Работать с Class.__dict__ для точного списка методов класса
- Исключать унаследованные методы через анализ MRO
Сравнение методов родительского и дочернего классов
При анализе наследования важно отделять методы, реально объявленные в дочернем классе, от унаследованных без изменений. Самый надёжный источник – атрибут __dict__, так как он отражает только те методы, которые определены непосредственно в теле класса.
Сравнение __dict__ родительского и дочернего классов по ключам позволяет мгновенно выявить новые и переопределённые методы. Если имя присутствует в обоих словарях, метод был переопределён, даже если реализация отличается лишь деталями. Это критично при поиске причин изменения поведения объекта.
Функция dir() полезна для общей картины, но для сравнения она вторична: dir() показывает итоговый набор методов с учётом наследования. Метод, видимый через dir(), но отсутствующий в __dict__ дочернего класса, гарантированно получен от родителя или более высокого уровня иерархии.
Для классов со сложным наследованием необходимо учитывать порядок разрешения методов. Атрибут __mro__ задаёт точную последовательность поиска, и его анализ позволяет определить, из какого класса фактически был взят метод при наличии нескольких родителей.
Практическая рекомендация – приводить имена методов к множествам и выполнять операции пересечения и разности. Такой подход наглядно выделяет методы, добавленные в дочернем классе, и устраняет шум от служебных атрибутов.
Если важно проверить совместимость интерфейса, одного сравнения имён недостаточно. Модуль inspect позволяет сравнить сигнатуры методов, выявляя изменения в параметрах, значениях по умолчанию и аннотациях, которые могут привести к ошибкам при полиморфном использовании.
Для отладки полезно сравнивать не только имена, но и ссылки на функции. Разные объекты функций с одинаковыми именами подтверждают переопределение, тогда как совпадение объектов указывает на прямое наследование без модификаций.
Систематическое сравнение методов родительских и дочерних классов снижает риск регрессий, упрощает контроль архитектурных решений и позволяет быстрее оценивать влияние изменений при рефакторинге.
Автоматическое создание документации по методам класса

Автоматическая генерация документации по методам класса в Python позволяет получить полную картину интерфейса без ручного анализа исходного кода. Ключевая идея – использовать интроспекцию: доступ к атрибутам класса, сигнатурам методов и строкам документации во время выполнения программы.
Базовый источник данных – атрибуты __doc__, __annotations__ и объект сигнатуры, доступный через стандартную библиотеку inspect. Они позволяют извлекать описание метода, типы аргументов, значения по умолчанию и возвращаемые типы, что критично для точной и воспроизводимой документации.
- Автоматическое извлечение сигнатур методов без выполнения их логики
- Поддержка docstring в форматах reStructuredText и Google-style
- Фильтрация приватных и магических методов по правилам проекта
- Генерация HTML, Markdown или PDF без изменения исходного кода
Качество результата напрямую зависит от дисциплины написания docstring. Если описание параметров и возвращаемых значений отсутствует или противоречит аннотациям типов, генератор не сможет компенсировать эти пробелы автоматически.
Практическая рекомендация – комбинировать аннотации типов и краткие, но формальные docstring. Это позволяет инструментам точно интерпретировать контракт метода и формировать документацию, пригодную как для разработчиков, так и для внешних пользователей API.
Автоматизация документации особенно полезна при рефакторинге: изменения в сигнатурах методов немедленно отражаются в сгенерированных описаниях. Это снижает риск рассинхронизации кода и документации и упрощает контроль качества на этапе ревью.
Вопрос-ответ:
Как быстро посмотреть все методы объекта класса, если я не знаю его внутреннее устройство?
Самый простой путь — воспользоваться встроенной функцией dir(). Она возвращает список атрибутов объекта, включая методы. Чтобы было удобнее читать результат, список часто фильтруют, оставляя только вызываемые элементы через callable(). Такой подход подходит для первичного знакомства с классом, особенно в интерактивной консоли.
Почему dir() показывает слишком много служебных методов с подчёркиваниями?
Это связано с тем, что Python хранит в классе не только пользовательские методы, но и специальные магические методы, отвечающие за работу языка. Если они мешают, можно отфильтровать имена, которые начинаются и заканчиваются двойным подчёркиванием. Тогда останется более наглядный список того, что реально используется в коде.
Чем отличается просмотр методов класса и экземпляра класса?
При просмотре самого класса отображаются методы, объявленные в нём и унаследованные от базовых классов. Экземпляр, помимо этого, может содержать динамически добавленные атрибуты. Поэтому dir(Класс) и dir(объект) могут давать похожие, но не полностью совпадающие списки.
Можно ли получить только методы без атрибутов данных?
Да, для этого обычно комбинируют dir() и getattr(). Проходя по именам и проверяя, является ли значение вызываемым, можно отобрать только методы. Такой приём часто используют для отладки или автоматической генерации документации.
Есть ли способ узнать сигнатуры методов, а не только их названия?
Для этого подходит модуль inspect. С его помощью можно получить информацию о параметрах методов, значениях по умолчанию и аннотациях типов. Это особенно полезно, если приходится работать с чужим кодом без подробных комментариев или описаний.
