python之Callable用法及说明

 更新时间:2026年04月08日 08:55:28   作者:大、男人  
文章解释了Python中的Callable,定义了可调用对象,提供了判断方法,并详细介绍了其在类型注解中的应用,文章还说明了如何让类的实例成为可调用对象

你想了解 Python 中的 Callable,它是 Python 中用于描述可调用对象的核心概念,同时在类型注解中有明确的专用用途,下面从概念、判断、类型注解、特殊情况四个方面全面讲解:

一、核心概念:什么是 Callable(可调用对象)

Callable 直译是“可调用的”,在 Python 中,凡是可以通过 () 括号语法进行调用的对象,都被称为可调用对象(Callable)。

常见的可调用对象包括:

  • 普通函数(通过 def 定义)
  • 匿名函数(通过 lambda 定义)
  • 类(调用类会创建实例,本质是调用类的 __new__ 方法,最终返回实例对象)
  • 类的实例(满足特定条件,后续会详细说明)
  • 内置函数/方法(如 print()、len()、list.append() 等)

二、如何判断一个对象是否是可调用的?

Python 提供了两种可靠的方式来判断对象是否为可调用对象:

方式1:使用内置函数callable()

这是最常用、最直观的判断方式,返回布尔值 True(可调用)或 False(不可调用)。

示例代码:

# 1. 普通函数
def normal_func():
    return "普通函数"

# 2. 匿名函数
lambda_func = lambda x: x * 2

# 3. 类
class MyClass:
    pass

# 4. 普通变量(不可调用)
num = 123
string = "hello"

# 判断各对象是否可调用
print(callable(normal_func))  # 输出:True
print(callable(lambda_func))  # 输出:True
print(callable(MyClass))      # 输出:True(调用类创建实例)
print(callable(num))          # 输出:False
print(callable(string))       # 输出:False

方式2:使用typing.Callable或collections.abc.Callable进行类型检查

通过 isinstance() 函数结合 Callable 类型,可以实现类型层面的判断(更适用于类型校验场景)。

示例代码:

from typing import Callable

def normal_func():
    return "普通函数"

lambda_func = lambda x: x * 2
num = 123

# 类型检查
print(isinstance(normal_func, Callable))  # 输出:True
print(isinstance(lambda_func, Callable))  # 输出:True
print(isinstance(num, Callable))          # 输出:False

注意:Python 3.9+ 中,collections.abc.Callable 可直接使用(无需导入 typing),兼容性更好。

三、typing.Callable的核心用途:类型注解

Callable 在实际开发中,最核心、最常用的场景是作为类型注解(Type Hinting),用于标注“可被调用的对象”(如函数参数、函数返回值),提升代码的可读性和可维护性。

1. 基础语法

标注格式:Callable[[参数类型列表], 返回值类型]

  • 中括号内 []:填写可调用对象的参数类型列表,无参数则写空列表 []
  • 后面的 , 之后:填写可调用对象的返回值类型

2. 实用示例

from typing import Callable

# 示例1:标注函数参数为可调用对象(接收一个int,返回一个int)
def process_data(data: int, handler: Callable[[int], int]) -> int:
    """
    处理数据,调用传入的可调用对象handler处理data
    :param data: 待处理的整数数据
    :param handler: 处理函数(接收int,返回int)
    :return: 处理后的结果
    """
    return handler(data)

# 定义一个符合注解要求的函数
def double_num(x: int) -> int:
    return x * 2

# 调用测试
result = process_data(10, double_num)
print(result)  # 输出:20

# 示例2:标注函数返回值为可调用对象
def create_adder(add_num: int) -> Callable[[int], int]:
    """返回一个加法函数"""
    def adder(x: int) -> int:
        return x + add_num
    return adder

# 创建一个“加5”的函数
add_5 = create_adder(5)
print(add_5(10))  # 输出:15

3. 简化标注(可选)

如果不需要精确标注参数类型,仅需标注“这是一个可调用对象”,可以直接使用 Callable(不指定参数和返回值类型):

from typing import Callable

def func(callback: Callable) -> None:
    callback()

func(lambda: print("Hello Callable"))  # 输出:Hello Callable

四、特殊情况:让类的实例成为可调用对象

默认情况下,类的实例是不可调用的,但如果在类中定义了 __call__() 特殊方法,该类的实例就会变成可调用对象,调用实例本质上就是调用 __call__() 方法。

示例代码:

class Counter:
    def __init__(self):
        self.count = 0  # 初始化计数器
    
    def __call__(self):
        self.count += 1  # 每次调用实例,计数器+1
        return self.count

# 创建类的实例
counter = Counter()

# 判断实例是否可调用
print(callable(counter))  # 输出:True

# 调用实例(本质调用 __call__() 方法)
print(counter())  # 输出:1
print(counter())  # 输出:2
print(counter())  # 输出:3

补充说明

  • __call__() 方法可以接收参数,用法和普通函数一致;
  • 这种特性常用于实现“有状态的函数”(实例可以保存状态,多次调用可复用状态)。

总结

  • Callable 描述可被 () 调用的对象,常见包括函数、类、内置方法等;
  • 判断可调用性可用 callable() 函数或 isinstance(obj, Callable);
  • typing.Callable 核心用途是类型注解,格式为 Callable[[参数类型], 返回值类型];
  • 类实例通过实现 __call__() 方法可成为可调用对象,调用实例即调用该方法。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Python的join函数的用法及实例

    Python的join函数的用法及实例

    这篇文章主要详细介绍了python的join函数的用法及实例,文章中有详细的代码讲解,有一定的参考价值,需要的同学可以参考阅读
    2023-04-04
  • Python获取远程文件大小的函数代码分享

    Python获取远程文件大小的函数代码分享

    这篇文章主要介绍了Python获取远程文件大小的函数代码分享,需要的朋友可以参考下
    2014-05-05
  • python迭代器自定义类的具体方法

    python迭代器自定义类的具体方法

    在本篇文章里小编给大家整理的是一篇关于python迭代器自定义类的具体方法,对此有兴趣的朋友们可以学习下。
    2021-03-03
  • 将图片导入Python的turtle库的详细过程

    将图片导入Python的turtle库的详细过程

    在Python编程的世界里,turtle库以其简单易用、图形化交互的特点,深受初学者喜爱,随着项目的复杂度增加,仅仅依靠线条和颜色来绘制图形可能已经不能满足需求,于是,如何将图片导入到turtle库中成为一个备受关注的问题,所以本文介绍了如何将图片导入Python的turtle库
    2025-05-05
  • Python中如何自定义函数

    Python中如何自定义函数

    这篇文章主要介绍了Python中如何自定义函数,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • python逆向之pyc反编译的使用教程

    python逆向之pyc反编译的使用教程

    python代码的运行是靠python解析器将源代码转换为字节码,本文主要介绍了python逆向之pyc反编译的使用教程,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • python实现在目录中查找指定文件的方法

    python实现在目录中查找指定文件的方法

    这篇文章主要介绍了python实现在目录中查找指定文件的方法,通过模糊查找与精确查找两个实例较为详细的阐述了文件查找的方法,是非常实用的技巧,需要的朋友可以参考下
    2014-11-11
  • python 比较字典value的最大值的几种方法

    python 比较字典value的最大值的几种方法

    这篇文章主要介绍了python 比较字典value的最大值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • 全解析MeanShift传统目标跟踪算法

    全解析MeanShift传统目标跟踪算法

    meanshift算法的原理很简单,假设你有一堆点集,还有一个小的窗口,这个窗口可能是圆形的,现在你可能要移动这个窗口到点集密度最大的区域当中,这篇文章主要介绍了传统目标跟踪——MeanShift算法,需要的朋友可以参考下
    2025-05-05
  • 简单谈谈Python中的反转字符串问题

    简单谈谈Python中的反转字符串问题

    本文给大家总结了5种可以实现python中反转字符串的方法,非常的实用,有需要的小伙伴可以参考下
    2016-10-10

最新评论