简体   繁体   中英

What is causing “unbound method __init__() must be called with instance as first argument” from this Python code?

I have this class:

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) 

and am calling it with this script:

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

and get this error and I can't figure out why: unbound method __init__() must be called with instance as first argument

You are doing:

Thread.__init__() 

Use:

Thread.__init__(self) 

Or, rather, use super()

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

super(Timer,self).__init__()

First, the reason you must use:

Thread.__init__(self)

instead of

Thread.__init__()

is because you are using the class name, and not an object (an instance of the class), so you cannot call a method in the same way as an object.

Second, if you are using Python 3, the recommended style for invoking a super class method from a sub class is:

super().method_name(parameters)

Although in Python 3 is possible to use:

SuperClassName.method_name(self, parameters)

It is an old style of syntax that is not the prefer style.

You just need to pass 'self' as an argument to 'Thread. init '. After that, it works on my machines.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM