Что такое callable-объект в Python?

Ответ

Callable-объект (вызываемый объект) в Python — это любой объект, который можно вызвать с помощью оператора (). Если объект можно вызвать, встроенная функция callable() вернет для него True.

Эта концепция является ключевой для функционального программирования в Python, позволяя передавать функции и методы как аргументы в другие функции (функции высшего порядка).

Основные типы вызываемых объектов:

  • Функции: Созданные через def или lambda.
  • Методы: Функции, связанные с экземпляром класса.
  • Классы: Вызов класса создает его экземпляр (MyClass()).
  • Экземпляры классов: Если в классе определен магический метод __call__().

Проверка и пример использования:

def regular_function():
    print("I am a function")

class MyCallableClass:
    def __call__(self, x):
        print(f"Instance called with {x}")

# Создаем экземпляр
my_instance = MyCallableClass()

# Проверяем объекты на вызываемость
print(f"Is function callable? {callable(regular_function)}") # True
print(f"Is class callable? {callable(MyCallableClass)}")     # True
print(f"Is instance callable? {callable(my_instance)}")     # True
print(f"Is integer callable? {callable(123)}")             # False

# Вызываем объекты
regular_function()      # Вывод: I am a function
my_instance(10)         # Вывод: Instance called with 10

Ответ 18+ 🔞

Ну ты смотри, какие питонячьи штуки бывают! Вот есть у них такая приблуда — Callable-объект, или, по-нашему, вызываемый объект. Это, блядь, любая хрень, которую можно ткнуть скобочками () и она что-то сделает. Проверить, можно ли её так ткнуть, помогает встроенная функция callable() — она вернёт True, если объект вызываемый, а иначе — ну, понятно.

Эта фигня — основа основ для так называемого «функционального программирования», где ты можешь пихать функции как аргументы в другие функции. Ёперный театр, звучит сложно, но на деле — удобно, блядь.

Какие бывают эти вызываемые твари:

  • Обычные функции: Те, что через def или lambda сделаны.
  • Методы: Функции, привязанные к какому-нибудь объекту-экземпляру.
  • Сами классы: Вызови класс скобочками — получишь новый экземпляр, вот и вся магия.
  • Экземпляры классов: Да-да, если в классе прописан волшебный метод __call__(), то его детища тоже можно вызывать. Хитрая жопа, но работает.

Как это проверить и применить:

def regular_function():
    print("I am a function")

class MyCallableClass:
    def __call__(self, x):
        print(f"Instance called with {x}")

# Создаем экземпляр
my_instance = MyCallableClass()

# Проверяем объекты на вызываемость
print(f"Is function callable? {callable(regular_function)}") # True
print(f"Is class callable? {callable(MyCallableClass)}")     # True
print(f"Is instance callable? {callable(my_instance)}")     # True
print(f"Is integer callable? {callable(123)}")             # False

# Вызываем объекты
regular_function()      # Вывод: I am a function
my_instance(10)         # Вывод: Instance called with 10

Вот и вся история. Главное — не пытайся вызвать цифру 123, а то получишь ошибку, и будешь сидеть, как дурак, и думать: «Ну и нахуя я это сделал?».