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

匿名 (未验证) 提交于 2019-12-03 08:41:19

问题:

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

回答1:

You are doing:

Thread.__init__()  

Use:

Thread.__init__(self)  

Or, rather, use super()



回答2:

This is a frequently asked question at SO, but the answer, in brief, is that the way you call your superclass's constructor is like:

super(Timer,self).__init__() 


回答3:

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



回答4:

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.



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!