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实现判断给定列表是否有重复元素的方法

    Python实现判断给定列表是否有重复元素的方法

    这篇文章主要介绍了Python实现判断给定列表是否有重复元素的方法,列举了2种列表判断方法,涉及Python针对列表的遍历、统计、判断等相关操作技巧,需要的朋友可以参考下
    2018-04-04
  • python 利用pywifi模块实现连接网络破解wifi密码实时监控网络

    python 利用pywifi模块实现连接网络破解wifi密码实时监控网络

    这篇文章主要介绍了python 利用pywifi模块实现连接网络破解wifi密码实时监控网络,需要的朋友可以参考下
    2019-09-09
  • 浅述python2与python3的简单区别

    浅述python2与python3的简单区别

    python2:print语句,语句就意味着可以直接跟要打印的东西而python3:print函数,函数就以为这必须要加上括号才能调用。下面通过本文给大家介绍python2与python3的简单区别,感兴趣的朋友跟随小编一起看看吧
    2018-09-09
  • 单链表反转python实现代码示例

    单链表反转python实现代码示例

    这篇文章主要介绍了单链表反转python实现,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02
  • 解决keras使用cov1D函数的输入问题

    解决keras使用cov1D函数的输入问题

    这篇文章主要介绍了解决keras使用cov1D函数的输入问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06
  • 基于Python进行Word文档模板自动化处理操作完整指南

    基于Python进行Word文档模板自动化处理操作完整指南

    在日常办公和文档处理工作中,我们经常需要根据模板生成大量相似结构的Word文档,本文将深入介绍如何实现Word文档模板的自动化处理,从占位符提取到智能填充的完整流程,希望对大家有所帮助
    2025-10-10
  • pycharm为项目选择的python解释器无效问题及解决

    pycharm为项目选择的python解释器无效问题及解决

    解决PyCharm中项目选择的Python解释器无效的问题,只需在运行编辑配置中将Python解释器路径设置为项目所在目录下的venv\Scripts\python.exe即可
    2026-03-03
  • Python中flask框架跨域问题的解决方法

    Python中flask框架跨域问题的解决方法

    本文主要介绍了Python中flask框架跨域问题的解决方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • Django Admin 管理工具的实现

    Django Admin 管理工具的实现

    这篇文章主要介绍了Django Admin 管理工具的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • Python使用python-docx库复制Word文档样式的实现方法

    Python使用python-docx库复制Word文档样式的实现方法

    在日常办公中,我们经常需要处理Word文档的格式调整、内容更新等任务,本文将介绍如何使用python-docx库来复制一个Word文档的内容及样式,并展示如何利用此方法进行文档内容的自动化处理,需要的朋友可以参考下
    2025-05-05

最新评论