前言
用过C语言的可能知道,函数指针(回调函数)是C语言的精髓。通过函数指针挂载函数名,可实现在必要的时候调用必要的函数,如下:
CVIMGPROC_TESTTYPE_S g_astCVTEST_Type[] =
{
{TEST_IMGPROC_TYPE_RBG2GRAY, CVTEST_TITLE_RGB2GRAY, cvtest_Test4_Rgb2Gray },
{TEST_IMGPROC_TYPE_MERGE, CVTEST_TITLE_MERGERIMG, cvtest_Test4_Merge2Img },
……
{TEST_IMGPROC_TYPE_STRING, CVTEST_TITLE_HONG2STR, cvtest_Test4_Hong2Str},
}
......
IMGPROC_TEST_PF pfFunc = NULL;
pfFunc = CVTEST_GetTestFunc(g_enTestTest);
if (NULL != pfFunc)
{
ulRet = pfFunc();
return ulRet;
}
其中,IMGPROC_TEST_PF是函数指针类型。CVTEST_GetTestFunc()函数通过枚举参数获取指定函数指针,若指针非空,则调用函数。
那么,python中如何实现类似的回调函数呢?
答案是function类。python中每次用def语句定义的一个函数都是一个function类的实例。如下:
>>> def func():
print("-----------")
>>> type(func)
<class 'function'>
有了function类,就可以有以下方法实现回调了。
通过LIST保存函数名
在LIST中直接保存函数名,后续通过LIST下标直接访问对应的函数,如下:
名为a 的list中直接保存两个函数:hello、world。后续通过a[0]、a[1]来得到这个函数,a[0]()表示调用函数。是不是很C语言很像??
通过DICT保存函数名
与LIST类似,可以通过DICT(字典)变量保存函数名,如下:
其他
比C更强大的是,python的function类实现了诸多属性、method。以往在C语言中通过函数指针获取函数名是不可行的吧,如今,python的function类实现了诸多属性、method用于记录其所保存的函数的信息。如下:
>>> dir(b['0'])
['__annotations__', '__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__get__', '__getattribute__', '__globals__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__kwdefaults__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
其中:
__name__代表函数名;
__module__代表函数名
……
如下:
>>> b['0'].__sizeof__
<built-in method __sizeof__ of function object at 0x028B2468>
>>>
>>> b['0'].__str__
<method-wrapper '__str__' of function object at 0x028B2468>
>>> b['0'].__module__
'__main__'
>>> b['0'].__call__
<method-wrapper '__call__' of function object at 0x028B2468>
>>> b['0'].__name__
'hello'
>>>
总结
没记错的话python是用C写的。python通过function类来保存函数的相关属性,这点比C语言方便多了。