Python內(nèi)置函數(shù)之callable函數(shù)解讀
在 Python 中,callable() 是一個(gè)內(nèi)置函數(shù),用于檢查一個(gè)對(duì)象是否可調(diào)用(即是否可以像函數(shù)一樣被調(diào)用)。本文將詳細(xì)解析其用法、返回值及實(shí)戰(zhàn)案例。
1. 函數(shù)定義與基本用法
callable(object) -> bool
功能:判斷對(duì)象是否可調(diào)用。
返回值:
True:對(duì)象可被調(diào)用(如函數(shù)、方法、類、實(shí)例等)。False:對(duì)象不可被調(diào)用(如整數(shù)、字符串、列表等)。
2. 可調(diào)用對(duì)象類型
(1) 函數(shù)和方法
def add(a, b):
return a + b
class Calculator:
def multiply(self, a, b):
return a * b
print(callable(add)) # 輸出: True
print(callable(Calculator().multiply)) # 輸出: True
(2) 類
類可被調(diào)用(調(diào)用時(shí)會(huì)創(chuàng)建實(shí)例):
print(callable(Calculator)) # 輸出: True obj = Calculator() # 類被調(diào)用,創(chuàng)建實(shí)例
(3) 實(shí)現(xiàn)__call__方法的實(shí)例
如果類定義了 __call__ 方法,則其實(shí)例可被調(diào)用:
class Adder:
def __call__(self, a, b):
return a + b
adder = Adder()
print(callable(adder)) # 輸出: True
print(adder(3, 4)) # 輸出: 7(實(shí)例被調(diào)用)
(4) 內(nèi)置可調(diào)用對(duì)象
如 len()、print() 等:
print(callable(len)) # 輸出: True
3. 不可調(diào)用對(duì)象類型
(1) 基本數(shù)據(jù)類型
x = 42 s = "hello" print(callable(x)) # 輸出: False print(callable(s)) # 輸出: False
(2) 列表、字典等容器
lst = [1, 2, 3]
dct = {"a": 1}
print(callable(lst)) # 輸出: False
print(callable(dct.get)) # 輸出: True(get是方法,可調(diào)用)
(3) 模塊
import math print(callable(math)) # 輸出: False print(callable(math.sqrt)) # 輸出: True
4. 實(shí)戰(zhàn)案例
案例 1:函數(shù)參數(shù)驗(yàn)證
確保傳入的參數(shù)是可調(diào)用對(duì)象:
def apply_function(func, x):
if not callable(func):
raise TypeError("func必須是可調(diào)用對(duì)象")
return func(x)
result = apply_function(lambda x: x**2, 5) # 正常
# apply_function(42, 5) # 報(bào)錯(cuò):TypeError
案例 2:動(dòng)態(tài)調(diào)用對(duì)象
根據(jù)條件選擇調(diào)用不同的函數(shù):
def add(a, b):
return a + b
def subtract(a, b):
return a - b
operation = add if True else subtract
print(callable(operation)) # 輸出: True
print(operation(5, 3)) # 輸出: 8
案例 3:實(shí)現(xiàn)可配置的回調(diào)函數(shù)
class EventHandler:
def __init__(self, callback=None):
self.callback = callback if callable(callback) else lambda x: None
def handle_event(self, data):
self.callback(data)
# 使用自定義回調(diào)
def log_data(data):
print(f"Logging: {data}")
handler = EventHandler(log_data)
handler.handle_event("Event occurred") # 輸出: Logging: Event occurred
# 使用默認(rèn)回調(diào)(無(wú)操作)
handler = EventHandler()
handler.handle_event("Silent event") # 無(wú)輸出
案例 4:模擬函數(shù)裝飾器
在調(diào)用函數(shù)前驗(yàn)證其可調(diào)用性:
def ensure_callable(func):
if not callable(func):
raise ValueError("傳入的不是可調(diào)用對(duì)象")
def wrapper(*args, **kwargs):
print(f"Calling {func.__name__}...")
return func(*args, **kwargs)
return wrapper
@ensure_callable
def greet(name):
return f"Hello, {name}!"
print(greet("Alice")) # 輸出: Calling greet... \n Hello, Alice!
5. 注意事項(xiàng)
callable() 返回 True 不保證調(diào)用成功:
class BadCallable:
def __call__(self):
raise Exception("Cannot be called")
obj = BadCallable()
print(callable(obj)) # 輸出: True
# obj() # 報(bào)錯(cuò):Exception
Python 3.0 vs 3.2+:
- 在 Python 3.0 中,
callable()曾被移除,后在 3.2 中重新添加。 - 若需兼容 3.0,可使用
hasattr(obj, '__call__')替代。
6. 總結(jié)
callable() 是一個(gè)簡(jiǎn)單但實(shí)用的工具,常用于:
- 參數(shù)驗(yàn)證:確保傳入的對(duì)象可被調(diào)用。
- 動(dòng)態(tài)編程:根據(jù)條件選擇調(diào)用不同的函數(shù)或方法。
- 框架開發(fā):實(shí)現(xiàn)回調(diào)機(jī)制、裝飾器等功能。
通過結(jié)合 callable() 和其他 Python 特性(如高階函數(shù)、類的 __call__ 方法),可以編寫出更加靈活和健壯的代碼。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python 處理數(shù)字,把大于上限的數(shù)字置零實(shí)現(xiàn)方法
今天小編就為大家分享一篇python 處理數(shù)字,把大于上限的數(shù)字置零實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2019-01-01
matplotlib.pyplot.plot()參數(shù)使用詳解
這篇文章主要介紹了matplotlib.pyplot.plot()參數(shù)詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
pytorch_pretrained_bert如何將tensorflow模型轉(zhuǎn)化為pytorch模型
這篇文章主要介紹了pytorch_pretrained_bert將tensorflow模型轉(zhuǎn)化為pytorch模型的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
Python制作簡(jiǎn)單的網(wǎng)頁(yè)爬蟲
自己寫的一個(gè)爬蟲,模仿了python核心編程書里的程序,有詳細(xì)的注釋。 是我一個(gè)理解學(xué)習(xí)的過程吧。 有需要的小伙伴可以參考下2015-11-11
python-Web-flask-視圖內(nèi)容和模板知識(shí)點(diǎn)西寧街
在本篇文章里小編給大家分享了關(guān)于python-Web-flask-視圖內(nèi)容和模板的相關(guān)知識(shí)點(diǎn)內(nèi)容,有需要的朋友們參考學(xué)習(xí)下。2019-08-08
如何利用python批量提取txt文本中所需文本并寫入excel
最近幫人寫了幾個(gè)小程序,所以記錄下,下面這篇文章主要給大家介紹了關(guān)于如何利用python批量提取txt文本中所需文本并寫入excel的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07
Python簡(jiǎn)單定義與使用字典dict的方法示例
這篇文章主要介紹了Python簡(jiǎn)單定義與使用字典的方法,結(jié)合簡(jiǎn)單實(shí)例形式分析了Python字典的原理、組成、定義及使用方法,需要的朋友可以參考下2017-07-07
Python下使用Scrapy爬取網(wǎng)頁(yè)內(nèi)容的實(shí)例
今天小編就為大家分享一篇Python下使用Scrapy爬取網(wǎng)頁(yè)內(nèi)容的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2018-05-05
python異步Web框架sanic的實(shí)現(xiàn)
這篇文章主要介紹了python異步Web框架sanic的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04

