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