Python判斷對象是否是functio
- 2020 年 1 月 10 日
- 筆記
在Python中,判斷一個對象是否是方法有如下三種方法。
1. 根據「__call__」屬性判斷
有時候用python就有這麼一種感悟,各種鉤子函數就是通過內置的「__」屬性實現,python學得好不好,就是對「__」屬性理解得透徹不透徹。
python函數在調用時,一定會首先調用其相關「__call__」函數(沒有空格),請參見python總結(四):類裝飾器與方法的動態添加中的用法。
add = lambda a, b: a + b # 判斷成功 if(hasattr(add, '__call__')): print add(1,2)
2. 利用callable判斷
這是一個據傳快要廢棄的方法,但是在Python 2中依舊很好用,如下:
# 判斷成功 if(callable(add)): print add(2, 2)
3. 利用isfunction進行判斷
Python的inspect模塊包含了大量的與反射、元數據相關的工具函數,isfunction就是其中一種,使用方法如下:
from inspect import isfunction # 判斷成功 if(isfunction(add)): print add(5, 5)
4. 無效的types.MethodType
出人意料的是types.MethodType竟然無效(版本2.7.14),如下:
import types # 竟然無效 if(isinstance(add, types.MethodType)): print add.__name__
在這個引申過程中,還發現了一些有意思的現象,不同的function的輸出結果不一樣:
>>> type(format) <type 'builtin_function_or_method'> >>> type(add) <type 'function'>
更有意思的是,type竟然無法對print進行操作,如下:
>>> type(print) File "<stdin>", line 1 type(print) ^ SyntaxError: invalid syntax
那print是什麼?
結論
如何判斷一個對象是否是方法,本文提供了3種方法,並發現了一些有意思的現象,再問一遍,print是什麼?