是什么导致这个Python代码出现“未绑定的方法__init__()必须以实例作为第一个参数”错误?

10 投票
4 回答
30563 浏览
提问于 2025-04-15 15:19

我有一个这样的类:

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()

但是我遇到了这个错误,我搞不清楚为什么:未绑定的方法 __init__() 必须以实例作为第一个参数来调用

4 个回答

3

首先,你必须使用:

Thread.__init__(self)

而不是

Thread.__init__()

的原因是因为你在使用类名,而不是类的一个实例(对象),所以你不能像调用对象的方法那样来调用。

其次,如果你使用的是Python 3,从子类调用父类的方法时,推荐的写法是:

super().method_name(parameters)

虽然在Python 3中也可以使用:

SuperClassName.method_name(self, parameters)

但那是一种旧的写法,不是推荐的风格。

9

这是一个在StackOverflow上经常被问到的问题,但简单来说,调用父类构造函数的方法是这样的:

super(Timer,self).__init__()
17

你现在的做法是:

Thread.__init__() 

可以改用:

Thread.__init__(self) 

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

撰写回答