定时线程函数作为类中的属性

时间:2014-07-07 22:03:10

标签: python multithreading function class

所以我正在制作一个基于文本的冒险游戏。我现在正在研究引擎,经过长时间寻找解决此问题的方法后我陷入困境。

我有一个名为use_action的类。该类的一个参数是函数的名称。我希望能够创建此操作并具有可能的自定义函数,以便调用此use_action的项执行特定的操作。

我现在正在使用的自定义功能是玩家受伤的地方,每隔几秒就会损失5 HP。

这应该在他使用特定项目时开始,然后在他使用将链接到停止功能的药物时停止。我遇到的问题是该函数立即被调用。即使我试图在一个long if else语句的末尾调用它。然后,当我到达我试图称呼它的地方时,它不会打电话。

我不会发布整个类,因为它的功能大约是150行代码。

class use_action(object):
    def __init__(self, function = None):
        self.function = function


pizza_act = use_action(function = mechanics.tmr.start())

#This is located at the end of an if else statement after the player types use . . . 
if self.function != None:
    self.function
else:
    pass

来自力学:

thread_list = []

class TimerClass(threading.Thread):
    def __init__(self, function, time):
        threading.Thread.__init__(self)
        self.event = threading.Event()
        self.function = function
        self.time = time
        thread_list.append(self)

    def run(self):
        while not self.event.is_set():
            self.event.wait( self.time )
            self.function()

    def stop(self):
        self.event.set()

def blank_current_readline():
    # Next line said to be reasonably portable for various Unixes
    (rows,cols) = struct.unpack('hh', fcntl.ioctl(sys.stdout, termios.TIOCGWINSZ,'1234'))

    text_len = len(readline.get_line_buffer())+2

    # ANSI escape sequences (All VT100 except ESC[0G)
    sys.stdout.write('\x1b[2K')                         # Clear current line
    sys.stdout.write('\x1b[1A\x1b[2K'*(text_len/cols))  # Move cursor up and clear line
    sys.stdout.write('\x1b[0G')                         # Move to start of line



def pizza_poisoned_action():
    # threading.Timer(10, pizza_poisoned_action).start()
    blank_current_readline()
    print "You lost 5 hp."
    initialization.gamer.hp -= 5
    sys.stdout.write('> ' + readline.get_line_buffer())
    sys.stdout.flush()          # Needed or text doesn't show until a key is pressed

tmr = TimerClass(pizza_poisoned_action, 5)

对于篇幅很抱歉,我试图只为此发布相关内容。如果您认为我应该发布一些可能相关的其他代码,请告诉我们!

1 个答案:

答案 0 :(得分:1)

如果要传递函数,调用它。否则,你将传递返回值。

pizza_act = use_action(function = mechanics.test()) #Wrong!
pizza_act = use_action(function = mechanics.test)  #Right