2013-12-13 140 views
2

我编写了一个简单的程序,通过子类threading.Thread来使用线程。如果我使用threading.Thread.__init__()直接,那么有没有错误为什么super().__ init__在子类化threading.Thread时不起作用?

TypeError: __init__() got multiple values for keyword argument 'group' 

:但是,如果使用super()调用它的父类,即threading.Thread__init__方法,我得到这个错误。

我的代码:

class MyThread(threading.Thread): 

    def __init__(self, group=None, target=None, name=None, args=(), 
       kwargs=None, verbose=None): 
     super(MyThread, self).__init__(self, group=group, target=target, 
             name=name, args=args, kwargs=kwargs, 
             verbose=verbose) 
     # threading.Thread.__init__(self, group=group, target=target, 
     #       name=name, args=args, kwargs=kwargs, 
     #       verbose=verbose) 
     self.args = args 

    def run(self): 
     print('a thread %d' % (self.args[0],)) 


if __name__ == '__main__': 
    for i in xrange(5): 
     thread = MyThread(args=(i,)) 
     thread.start() 

回答

11

您传递self第一个参数;不要这样做。从参数列表中删除self和您的通话将工作:

super(MyThread, self).__init__(group=group, target=target, 
           name=name, args=args, kwargs=kwargs, 
           verbose=verbose) 

super()给你一个约束方法,self已经被传递给你(这是从第二个参数采取super())。

由于group处于Thread.__init__()方法签名(self后)第一位置参数,Python是施加您多余self参数给group参数,然后找到一个明确的group=group参数为好。

+1

线程混淆了所有的自己。有人只是把*超级放入混音中。 –

+0

我明白了。非常感谢:D – flyer

相关问题