在Python中注册要在事件上调用的函数

问题描述 投票:1回答:2

我想编写一个在事件发生后将被调用的函数,但前提是用户已经注册了该函数。

#Defination
def fnBookUber(objUser):
    print 'Inside fbBookUber()'

#calling
def myEvent(objUser):
    print 'This event has fired'
    # This function will fill objUser too
    fnBookUber(objUser)

#Registeration
fnRegisterRideBooking(fnBookUber)

我知道我的解释有点古怪,但我不知道如何在python中完成此操作,尽管我坚信必须有许多方法可以在python中完成此操作。另外,我认为这可以在C ++中使用function pointers和在C#中使用delegates来实现。

python events callback function-pointers
2个回答
0
投票

您可以使用Decorators完成代码。

def log(func):
    def wrapper(*args, **kw):
        print('call %s():' % func.__name__)
        return func(*args, **kw)
    return wrapper

@log
def now():
    print('2015-3-25')

>>> now()
call now():
2015-3-25

您也可以访问链接:https://www.python.org/dev/peps/pep-0318/以获取更多帮助。


0
投票

这里是注册和呼叫事件的一种方法。

import types

#Callback
def fnBookUber(objUser):
    print('Inside fbBookUber()')

class myEvent:
    def __init__(self):
        self.callbacks = list()

    def register_callback(self, callback: types.FunctionType):
        self.callbacks.append(callback)

    def call(self, objUser):
        print('This event has fired')

        for callback in self.callbacks:
            callback(objUser)

if __name__ == "__main__":
    myEvent = myEvent()

    #Registration
    myEvent.register_callback(fnBookUber)

    #Calling/Firing the event
    myEvent.call()

您也可以直接传递函数,例如

def myEvent(objUser, callback):
    print('This event has fired')
    callback(objUser)

并将事件称为:

myEvent(objUser, fnBookUber)

这比上一个不灵活。

© www.soinside.com 2019 - 2024. All rights reserved.