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是什麼?