是什么导致“未绑定的方法__init __()必须使用实例作为第一个参数调用”来自此Python代码?

时间:2009-10-23 18:24:05

标签: python init

我有这堂课:

from threading import Thread 
import time

class Timer(Thread): 
    def __init__(self, interval, function, *args, **kwargs): 
        Thread.__init__() 
        self.interval = interval 
        self.function = function 
        self.args = args 
        self.kwargs = kwargs 
        self.start()

    def run(self): 
        time.sleep(self.interval) 
        return self.function(*self.args, **self.kwargs) 

我正在用这个脚本调用它:

    import timer 
    def hello():
        print \"hello, world
    t = timer.Timer(1.0, hello)
    t.run()

并收到此错误,我无法弄清楚原因:unbound method __init__() must be called with instance as first argument

4 个答案:

答案 0 :(得分:16)

你在做:

Thread.__init__() 

使用:

Thread.__init__(self) 

或者更确切地说,使用super()

答案 1 :(得分:9)

这是SO的常见问题,但简而言之,答案就是你调用超类的构造函数的方式如下:

super(Timer,self).__init__()

答案 2 :(得分:2)

首先,你必须使用的原因:

Thread.__init__(self)

而不是

Thread.__init__()

是因为您使用的是类名,而不是对象(类的实例),因此您无法以与对象相同的方式调用方法。

其次,如果您使用的是Python 3,那么从子类调用超类方法的推荐样式是:

super().method_name(parameters)

虽然在Python 3中可以使用:

SuperClassName.method_name(self, parameters)

这是一种古老的语法风格,不是首选的风格。

答案 3 :(得分:1)

你只需要将'self'作为参数传递给'Thread。 init '。之后,它可以在我的机器上运行。