python转行系列2:回调函数-function类

这篇博客介绍了Python中如何实现回调函数,通过function类将函数作为对象进行操作。文中提到了两种方式,包括使用LIST保存函数名和通过DICT保存函数名,并详细解释了这两种方法的工作原理。此外,还探讨了Python function类提供的额外属性和方法,如__name__和__module__,这些特性使得在Python中处理函数更加灵活和强大。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

         用过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语言方便多了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值