python - 为什么 super().__init__ 在子类化 threading.Thread 时不起作用?

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

最佳答案

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

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

super() 给你一个 bound 方法,self 已经为你传入(它取自第二个参数super()).

由于 groupThread.__init__() 方法签名中的第一个位置参数(在 self 之后),Python 正在应用您的剩余self 参数传递给 group 参数,然后找到一个明确的 group=group 参数。

关于python - 为什么 super().__init__ 在子类化 threading.Thread 时不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20562842/

相关文章:

java - 查找等待从 ArrayBlockingQueue 轮询的任务数量?

python - 有条件的字典理解

python - 从异构文本文件中提取带有指数的数字

math - 在 Python 中编写简单数学计算的最佳实践

python - 如何忽略在另一个任务的 run() 中触发的 Luigi 任务失败

python - 如何保存 MNIST 在 tensorflow 上测试的训练数据权重以供将来使用?

python - OCaml 中的 Cholesky 分解

c++ - boost 互斥顺序

multithreading - IdHTTP获取响应线程

Python datetime 到 XML Schema 时间戳格式