向类方法传递多个函数

2024-09-27 23:26:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我在下面定义了TaskTimer类,我想在触发事件时执行多个函数,这些函数可能有争论,也可能没有争论。我想想出一个通用的方法。我的职能没有得到执行,我不明白为什么。我在t.start()中的论点有误吗?在

import System  
from System.Timers import (Timer, ElapsedEventArgs)


class TaskTimer(object):

    def __init__ (self):
        self.timer = Timer ()
        self.timer.Enabled = False
        self.handlers =[]

    def On_Timed_Event (self,source, event):

        print 'Event fired', event.SignalTime


        for handler in self.handlers:
            handler(*self.my_args,**self.kwargs)

    def start(self,interval, repeat, *args, **kwargs):

        self.repeat = repeat
        self.run = True                     #True if timer is running
        self.timer.Interval= interval
        self.timer.Enabled = True

        self.my_args= args
        self.kwargs = kwargs


        for x in self.my_args:
            self.handlers.append(x)

        self.timer.Elapsed += self.On_Timed_Event  


def func1(a,b):
    print 'function 1. this function does task1'
    print '1...1...1...'
    return None

def func2(d):
    print 'Function 2. This function does something'
    print '2...2...2...'
    return None 

def func3(a,b,c):
    print 'function 3. This function does something else'
    return None


def main():

    t= TaskTimer()
    D= {'fun2':'func2', 'arg2':'3'}
    t.start(5000,False,func1, func2, func3, a= 1, b=3, c=4, d=D)


if __name__ == '__main__':   
    main()

我正在进行实验,因此我编辑了def_Timed_Event函数和func1、func2和func3,如下所示。我还按照@Ewan的建议在函数中添加了print语句。Python是否自动替换来自**自我夸克?在

^{pr2}$

代码在IronPython控制台中运行。 ![IronPython_控制台][2]

  [2]: http://i.stack.imgur.com/vYW0S.jpg

Tags: 函数selfeventmyhandlersdefargsfunction
1条回答
网友
1楼 · 发布于 2024-09-27 23:26:29

首先,我可以看到你在这条线路上遇到了麻烦:

handler(*self.my_args,**self.kwargs)

由于您不接受func1func2或{}中的任何额外的kwargs,如果它到达他们那里,我希望看到以下内容:

In [1]: def func1(a, b):
   ...:     print(a, b)
   ...:

In [2]: kwg = {'a':1, 'b':3, 'c':4, 'd':{'fun2':'func2', 'arg2':'3'}}

In [3]: func1(**kwg)
                                     -
TypeError                                 Traceback (most recent call last)
<ipython-input-3-12557b6441ce> in <module>()
  > 1 func1(**kwg)

TypeError: func1() got an unexpected keyword argument 'c'

就我个人而言,我会放入一些不错的日志记录/调试语句,以找出程序在堆栈中的位置。在

  • 程序是否成功完成,或者您正在进行回溯?在
  • 这是用来做什么的:self.timer.Elapsed += self.On_Timed_Event
    • 它看起来应该在您的timer.Elapsed值上添加一个时间,但是self.On_Timed_Event没有返回任何内容
  • On_Timed_Event接受2个参数(source, event),但是您似乎没有传入它们,这也会导致程序失败。在
  • 你在你的stdout中看到了Event fired,还是程序根本没有到达{}?这可能表明System.Timers代码中存在问题。在

相关问题 更多 >

    热门问题