Pythonが対象がfunctionかどうかを判断する3つの方法


Pythonでは,1つのオブジェクトがメソッドであるか否かを判断するには,次の3つの方法がある.
1.「_call_」による属性判定
pythonを使っていると、いろいろなフック関数が内蔵されている「」であることを悟ることがあります.属性実装、pythonがよく勉強したかどうかは、""に対してです.属性の理解が徹底していない.
python関数は、呼び出すと必ず最初に関連する「_call_」を呼び出す関数(スペースなし)は、pythonのまとめ(4):クラスアクセラレータとメソッドの動的追加での使用法を参照してください.
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はその1つで、使用方法は次のとおりです.
from inspect import isfunction
#       
if(isfunction(add)):
    print add(5, 5)

4.無効なtypes.MethodType
意外にも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 "", line 1
    type(print)
             ^
SyntaxError: invalid syntax

printは何ですか?
結論
どのように1つの対象が方法であるかを判断するか、本文は3つの方法を提供して、そしていくつかの面白い現象を発見して、もう一度聞いて、printは何ですか?