← Назад к вопросам

Как посмотреть методы объекта?

1.0 Junior🔥 141 комментариев
#Python Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Просмотр методов объекта в Python

Просмотр методов и атрибутов объекта — ценный навык для отладки, исследования кода и работы с неизвестными библиотеками. Python предоставляет множество способов для этого.

1. Функция dir()

dir() — самый простой способ получить список атрибутов и методов:

class Car:
    def __init__(self, brand):
        self.brand = brand
    
    def drive(self):
        return f"{self.brand} едет"
    
    def stop(self):
        return "Машина остановилась"

car = Car("Toyota")

# Получить ВСЕ атрибуты и методы
methods = dir(car)
print(methods)
# ['__class__', '__delattr__', '__dict__', '__dir__', ..., 'brand', 'drive', 'stop']

# Отфильтровать только пользовательские методы
custom_methods = [m for m in dir(car) if not m.startswith('_')]
print(custom_methods)  # ['brand', 'drive', 'stop']

2. Функция type()

object_list = ["test", 42, [1, 2, 3], {"key": "value"}]

for obj in object_list:
    print(f"{obj} -> {type(obj).__name__}")
    # test -> str
    # 42 -> int
    # [1, 2, 3] -> list
    # {'key': 'value'} -> dict

# Получить тип объекта
object_type = type(car)
print(object_type)  # <class '__main__.Car'>
print(object_type.__name__)  # Car

3. Функция vars() и dict

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    
    def greet(self):
        return f"Привет, я {self.name}"

person = Person("John", 30)

# Получить все атрибуты экземпляра
print(vars(person))  # {'name': 'John', 'age': 30}
print(person.__dict__)  # {'name': 'John', 'age': 30}

# Для класса
print(vars(Person))  # Словарь с методами класса

# Проверить наличие атрибута
if 'name' in vars(person):
    print(f"Есть имя: {person.name}")

4. Функция getattr() и hasattr()

class Config:
    debug = True
    timeout = 30
    
    def get_info(self):
        return "Config instance"

config = Config()

# Проверить наличие атрибута
if hasattr(config, 'debug'):
    print(f"debug = {getattr(config, 'debug')}")

if hasattr(config, 'unknown'):
    print("Есть unknown")
else:
    print("Нет unknown")

# Получить значение с дефолтом
value = getattr(config, 'unknown', 'default_value')
print(value)  # default_value

# Получить все методы
methods = [m for m in dir(config) if callable(getattr(config, m))]
print(methods)  # ['get_info', ...]

5. Inspect модуль — детальный анализ

import inspect

class DataProcessor:
    """Обработчик данных"""
    
    def __init__(self, name):
        self.name = name
    
    def process(self, data: list) -> dict:
        """Обработать данные"""
        return {"result": len(data)}
    
    def validate(self, value: int = 0) -> bool:
        """Проверить значение"""
        return value > 0

processor = DataProcessor("MyProcessor")

# Получить все члены класса
members = inspect.getmembers(processor)
for name, value in members:
    if not name.startswith('_'):
        print(f"{name}: {type(value).__name__}")

# Получить только методы
methods = inspect.getmembers(processor, predicate=inspect.ismethod)
for name, method in methods:
    if not name.startswith('_'):
        print(f"Метод: {name}")

# Получить сигнатуру функции
sig = inspect.signature(processor.process)
print(f"Параметры process: {sig}")
# Параметры process: (data: list) -> dict

for param_name, param in sig.parameters.items():
    print(f"  {param_name}: {param.annotation}")

# Получить исходный код
print(inspect.getsource(processor.process))

# Получить документацию
print(inspect.getdoc(processor.process))
# Обработать данные

6. Функция callable()

class Service:
    def execute(self):
        return "Executed"

service = Service()

# Проверить, является ли атрибут вызываемым
for attr_name in dir(service):
    if not attr_name.startswith('_'):
        attr = getattr(service, attr_name)
        is_callable = callable(attr)
        print(f"{attr_name}: callable={is_callable}")
        # execute: callable=True

7. Функция help()

from datetime import datetime

# Получить справку по объекту
help(datetime.now)

# Или интерактивно в REPL
# >>> help(str.replace)
# Help on method_descriptor:
#
# replace(...)
#     S.replace(old, new[, count]) -> str
#     Return a copy of S with all occurrences of substring old replaced by new.

# Для пользовательского класса
help(DataProcessor)

8. Полезная функция для исследования

def explore_object(obj):
    """Комплексное исследование объекта"""
    print(f"\n=== Исследование объекта {type(obj).__name__} ===")
    
    # Тип
    print(f"\nТип: {type(obj)}")
    
    # Атрибуты
    print(f"\nАтрибуты (vars):")
    for key, value in vars(obj).items():
        print(f"  {key} = {repr(value)[:60]}")
    
    # Методы
    print(f"\nМетоды:")
    for name in dir(obj):
        if not name.startswith('_'):
            attr = getattr(obj, name)
            if callable(attr):
                sig = inspect.signature(attr) if hasattr(inspect, 'signature') else ''
                print(f"  {name}{sig}")
    
    # Свойства
    print(f"\nСвойства (properties):")
    for name, attr in inspect.getmembers(type(obj)):
        if isinstance(attr, property):
            print(f"  {name}")

# Использование
explore_object(datetime.now())

9. Получить сигнатуру и аннотации

import inspect
from typing import List, Dict

class API:
    def fetch_users(self, limit: int = 10, offset: int = 0) -> List[Dict]:
        """Получить пользователей"""
        return []

api = API()

# Сигнатура
sig = inspect.signature(api.fetch_users)
print(f"Сигнатура: {sig}")
# Сигнатура: (limit: int = 10, offset: int = 0) -> List[Dict]

# Аннотации
print(f"Аннотации: {api.fetch_users.__annotations__}")
# Аннотации: {'limit': <class 'int'>, 'offset': <class 'int'>, 'return': typing.List[typing.Dict]}

# Параметры
for param_name, param in sig.parameters.items():
    print(f"  {param_name}:")
    print(f"    Аннотация: {param.annotation}")
    print(f"    Дефолт: {param.default}")
    print(f"    Kind: {param.kind}")

10. Интроспекция с doc и name

class Example:
    """Класс с документацией"""
    
    def method(self):
        """Метод с документацией"""
        pass

example = Example()

# Имя
print(f"Имя класса: {example.__class__.__name__}")
print(f"Имя метода: {example.method.__name__}")

# Документация
print(f"Документ класса: {Example.__doc__}")
print(f"Документ метода: {example.method.__doc__}")

# Модуль
print(f"Модуль: {Example.__module__}")

# MRO (Method Resolution Order)
print(f"MRO: {Example.__mro__}")

11. Практический пример — Debug helper

def debug_object(obj, verbose=False):
    """Отладочная функция для объектов"""
    print(f"\n{'='*60}")
    print(f"ОБЪЕКТ: {type(obj).__name__}")
    print(f"{'='*60}")
    
    # Инстанс атрибуты
    print(f"\nИнстанс атрибуты:")
    if hasattr(obj, '__dict__'):
        for key, val in obj.__dict__.items():
            val_str = str(val)[:50]
            print(f"  .{key} = {val_str}")
    
    # Публичные методы
    print(f"\nПубличные методы:")
    for name in sorted(dir(obj)):
        if not name.startswith('_'):
            attr = getattr(obj, name)
            if callable(attr):
                print(f"  .{name}()")
    
    # Тип и базовые классы
    print(f"\nТип: {type(obj)}")
    if hasattr(obj.__class__, '__bases__'):
        print(f"Базовые классы: {obj.__class__.__bases__}")
    
    if verbose:
        print(f"\nВсе атрибуты (include dunder):")
        for name in sorted(dir(obj)):
            print(f"  .{name}")
    
    print(f"\n{'='*60}\n")

# Использование
from collections import OrderedDict
debug_object(OrderedDict())

Best Practices

  • dir() — быстрый обзор доступных методов
  • inspect модуль — когда нужна детальная информация
  • help() — встроенная справка
  • hasattr/getattr — безопасный доступ к атрибутам
  • vars() — для просмотра инстанс атрибутов
  • type() — для определения типа
  • callable() — для проверки вызываемости

Эти инструменты незаменимы при разработке, отладке и работе с неизвестными библиотеками.

Как посмотреть методы объекта? | PrepBro