为什么在子类化threading.Thread时,super().__ init__不起作用?

时间:2013-12-13 09:16:41

标签: python multithreading python-2.7

我编写了一个简单的程序,通过继承threading.Thread来使用线程。但是,如果我使用super()来调用其父类的__init__方法,即threading.Thread,则会出现此错误:

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

如果我直接使用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()

1 个答案:

答案 0 :(得分:11)

您正在传递self第一个参数;不要这样做。从参数列表中删除self,您的调用将起作用:

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

super()为您提供了一个绑定方法,self已经为您传入(它是从第二个参数转移到super())。< / p>

由于groupThread.__init__()方法签名中的第一个位置参数(self之后),因此Python将您的剩余self参数应用于group参数,然后查找显式的group=group参数。