当我将方法作为参数时,属性就会消失

时间:2017-01-08 21:17:43

标签: python methods

我寻找答案,但没有人适合我的问题...... 我试图创建一个Timer,它应该每n个时钟调用一个给定的函数,但它不起作用,当我调试我的对象时,应该存储调用函数的属性callback_function就会消失。

以下是代码:

import pygame

class Timer:
    def __init__(self, time, callback_function, repeat=False, how_many=0,
                 infinite=False, *args, **kwargs):
    self.now = pygame.time.get_ticks()
    self.time = time
    self.callback_function = callback_function
    self.repeat = repeat
    self.how_many = how_many
    self.infinite = infinite
    self.args = args
    self.kwargs = kwargs
    self.active = True

    def update(self):
        if pygame.time.get_ticks() - self.now >= self.time and self.active:
            self.callback_function(self.args, self.kwargs)

            if((self.how_many == 0 and not self.infinite) or 
               self.repeat == False):
                self.active = False
                return False
            elif not self.infinite:
                self.how_many -= 1

            self.now = pygame.time.get_ticks()
            return True

更多代码:

import pygame

from api.ActorSprite import ActorSprite
from api.Timer import Timer

class ActorTest(ActorSprite):
    def __init__(self):
        super().__init__(pygame.image.load("assets/mario.jpg").convert())

        self.add_timer(timer = Timer(2000, self.print_test,repeat=True,how_many=2))

    def draw(self, screen):
        super().draw(screen)
        self.update_timers()

    def print_test(self, *args, **kwargs):
        print("Hello World!")

没有错误消息,函数print_test没有被调用。但是当我不使用超级ActorTest来管理Timer时,它就可以了...我不明白!

这些是我调试器的截图:

2 个答案:

答案 0 :(得分:2)

我不确定这是否真的是你问题的原因,而不是这个:

self.callback_function = lambda *args, **kwargs: callback_function(args, kwargs)

你应该写一下

self.callback_function = callback_function

答案 1 :(得分:0)

好的我很抱歉这只是我调试器的一个错误,问题不在那里。现在效果很好,谢谢!