python之Callable用法及說(shuō)明
你想了解 Python 中的 Callable,它是 Python 中用于描述可調(diào)用對(duì)象的核心概念,同時(shí)在類型注解中有明確的專用用途,下面從概念、判斷、類型注解、特殊情況四個(gè)方面全面講解:
一、核心概念:什么是 Callable(可調(diào)用對(duì)象)
Callable 直譯是“可調(diào)用的”,在 Python 中,凡是可以通過(guò) () 括號(hào)語(yǔ)法進(jìn)行調(diào)用的對(duì)象,都被稱為可調(diào)用對(duì)象(Callable)。
常見的可調(diào)用對(duì)象包括:
- 普通函數(shù)(通過(guò)
def定義) - 匿名函數(shù)(通過(guò)
lambda定義) - 類(調(diào)用類會(huì)創(chuàng)建實(shí)例,本質(zhì)是調(diào)用類的
__new__方法,最終返回實(shí)例對(duì)象) - 類的實(shí)例(滿足特定條件,后續(xù)會(huì)詳細(xì)說(shuō)明)
- 內(nèi)置函數(shù)/方法(如
print()、len()、list.append()等)
二、如何判斷一個(gè)對(duì)象是否是可調(diào)用的?
Python 提供了兩種可靠的方式來(lái)判斷對(duì)象是否為可調(diào)用對(duì)象:
方式1:使用內(nèi)置函數(shù)callable()
這是最常用、最直觀的判斷方式,返回布爾值 True(可調(diào)用)或 False(不可調(diào)用)。
示例代碼:
# 1. 普通函數(shù)
def normal_func():
return "普通函數(shù)"
# 2. 匿名函數(shù)
lambda_func = lambda x: x * 2
# 3. 類
class MyClass:
pass
# 4. 普通變量(不可調(diào)用)
num = 123
string = "hello"
# 判斷各對(duì)象是否可調(diào)用
print(callable(normal_func)) # 輸出:True
print(callable(lambda_func)) # 輸出:True
print(callable(MyClass)) # 輸出:True(調(diào)用類創(chuàng)建實(shí)例)
print(callable(num)) # 輸出:False
print(callable(string)) # 輸出:False
方式2:使用typing.Callable或collections.abc.Callable進(jìn)行類型檢查
通過(guò) isinstance() 函數(shù)結(jié)合 Callable 類型,可以實(shí)現(xiàn)類型層面的判斷(更適用于類型校驗(yàn)場(chǎng)景)。
示例代碼:
from typing import Callable
def normal_func():
return "普通函數(shù)"
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 可直接使用(無(wú)需導(dǎo)入 typing),兼容性更好。
三、typing.Callable的核心用途:類型注解
Callable 在實(shí)際開發(fā)中,最核心、最常用的場(chǎng)景是作為類型注解(Type Hinting),用于標(biāo)注“可被調(diào)用的對(duì)象”(如函數(shù)參數(shù)、函數(shù)返回值),提升代碼的可讀性和可維護(hù)性。
1. 基礎(chǔ)語(yǔ)法
標(biāo)注格式:Callable[[參數(shù)類型列表], 返回值類型]
- 中括號(hào)內(nèi)
[]:填寫可調(diào)用對(duì)象的參數(shù)類型列表,無(wú)參數(shù)則寫空列表[] - 后面的
,之后:填寫可調(diào)用對(duì)象的返回值類型
2. 實(shí)用示例
from typing import Callable
# 示例1:標(biāo)注函數(shù)參數(shù)為可調(diào)用對(duì)象(接收一個(gè)int,返回一個(gè)int)
def process_data(data: int, handler: Callable[[int], int]) -> int:
"""
處理數(shù)據(jù),調(diào)用傳入的可調(diào)用對(duì)象handler處理data
:param data: 待處理的整數(shù)數(shù)據(jù)
:param handler: 處理函數(shù)(接收int,返回int)
:return: 處理后的結(jié)果
"""
return handler(data)
# 定義一個(gè)符合注解要求的函數(shù)
def double_num(x: int) -> int:
return x * 2
# 調(diào)用測(cè)試
result = process_data(10, double_num)
print(result) # 輸出:20
# 示例2:標(biāo)注函數(shù)返回值為可調(diào)用對(duì)象
def create_adder(add_num: int) -> Callable[[int], int]:
"""返回一個(gè)加法函數(shù)"""
def adder(x: int) -> int:
return x + add_num
return adder
# 創(chuàng)建一個(gè)“加5”的函數(shù)
add_5 = create_adder(5)
print(add_5(10)) # 輸出:15
3. 簡(jiǎn)化標(biāo)注(可選)
如果不需要精確標(biāo)注參數(shù)類型,僅需標(biāo)注“這是一個(gè)可調(diào)用對(duì)象”,可以直接使用 Callable(不指定參數(shù)和返回值類型):
from typing import Callable
def func(callback: Callable) -> None:
callback()
func(lambda: print("Hello Callable")) # 輸出:Hello Callable
四、特殊情況:讓類的實(shí)例成為可調(diào)用對(duì)象
默認(rèn)情況下,類的實(shí)例是不可調(diào)用的,但如果在類中定義了 __call__() 特殊方法,該類的實(shí)例就會(huì)變成可調(diào)用對(duì)象,調(diào)用實(shí)例本質(zhì)上就是調(diào)用 __call__() 方法。
示例代碼:
class Counter:
def __init__(self):
self.count = 0 # 初始化計(jì)數(shù)器
def __call__(self):
self.count += 1 # 每次調(diào)用實(shí)例,計(jì)數(shù)器+1
return self.count
# 創(chuàng)建類的實(shí)例
counter = Counter()
# 判斷實(shí)例是否可調(diào)用
print(callable(counter)) # 輸出:True
# 調(diào)用實(shí)例(本質(zhì)調(diào)用 __call__() 方法)
print(counter()) # 輸出:1
print(counter()) # 輸出:2
print(counter()) # 輸出:3
補(bǔ)充說(shuō)明
__call__()方法可以接收參數(shù),用法和普通函數(shù)一致;- 這種特性常用于實(shí)現(xiàn)“有狀態(tài)的函數(shù)”(實(shí)例可以保存狀態(tài),多次調(diào)用可復(fù)用狀態(tài))。
總結(jié)
Callable描述可被()調(diào)用的對(duì)象,常見包括函數(shù)、類、內(nèi)置方法等;- 判斷可調(diào)用性可用
callable()函數(shù)或isinstance(obj, Callable); typing.Callable核心用途是類型注解,格式為Callable[[參數(shù)類型], 返回值類型];- 類實(shí)例通過(guò)實(shí)現(xiàn)
__call__()方法可成為可調(diào)用對(duì)象,調(diào)用實(shí)例即調(diào)用該方法。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python獲取遠(yuǎn)程文件大小的函數(shù)代碼分享
這篇文章主要介紹了Python獲取遠(yuǎn)程文件大小的函數(shù)代碼分享,需要的朋友可以參考下2014-05-05
將圖片導(dǎo)入Python的turtle庫(kù)的詳細(xì)過(guò)程
在Python編程的世界里,turtle庫(kù)以其簡(jiǎn)單易用、圖形化交互的特點(diǎn),深受初學(xué)者喜愛,隨著項(xiàng)目的復(fù)雜度增加,僅僅依靠線條和顏色來(lái)繪制圖形可能已經(jīng)不能滿足需求,于是,如何將圖片導(dǎo)入到turtle庫(kù)中成為一個(gè)備受關(guān)注的問(wèn)題,所以本文介紹了如何將圖片導(dǎo)入Python的turtle庫(kù)2025-05-05
python實(shí)現(xiàn)在目錄中查找指定文件的方法
這篇文章主要介紹了python實(shí)現(xiàn)在目錄中查找指定文件的方法,通過(guò)模糊查找與精確查找兩個(gè)實(shí)例較為詳細(xì)的闡述了文件查找的方法,是非常實(shí)用的技巧,需要的朋友可以參考下2014-11-11
全解析MeanShift傳統(tǒng)目標(biāo)跟蹤算法
meanshift算法的原理很簡(jiǎn)單,假設(shè)你有一堆點(diǎn)集,還有一個(gè)小的窗口,這個(gè)窗口可能是圓形的,現(xiàn)在你可能要移動(dòng)這個(gè)窗口到點(diǎn)集密度最大的區(qū)域當(dāng)中,這篇文章主要介紹了傳統(tǒng)目標(biāo)跟蹤——MeanShift算法,需要的朋友可以參考下2025-05-05
簡(jiǎn)單談?wù)凱ython中的反轉(zhuǎn)字符串問(wèn)題
本文給大家總結(jié)了5種可以實(shí)現(xiàn)python中反轉(zhuǎn)字符串的方法,非常的實(shí)用,有需要的小伙伴可以參考下2016-10-10

