从Thread继承时调用超类构造函数

时间:2013-03-01 01:42:59

标签: python multithreading inheritance constructor

我很好奇为什么当我的类继承自Thread时,我无法调用super(Thread, self).__init__()而不是Thread.__init__(self)。你能帮我理解这个问题吗?

#!/usr/bin/python

from threading import Thread
from Queue import Queue
class ThreadManager(object):

    def work(self, items):
        q = Queue()
        for item in items:
            q.put(item)

        print q.qsize()

        p = Worker()
        p.start()
        p.join()

class Worker(Thread):
    def __init__(self):
        # Why doesn't this work?
        #super(Thread, self).__init__()

        Thread.__init__(self)

    def run(self):
        print 'thread running'

def main():
    items = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
    tm = ThreadManager()
    tm.work(items)

if __name__ == "__main__":
    main()

1 个答案:

答案 0 :(得分:1)

  

我很好奇为什么当我的班级继承自super(Thread, self).__init__()时,我无法拨打Thread.__init__(self)而不是Thread

因为那不是super的工作方式。您必须将自己的类型作为第一个参数传递,以便它可以搜索该类型的下一个祖先。如果你传递Thread,则要求Thread的祖先。

如果你的父类是一个普通的新式Python类,那么这个错误通常意味着你跳过一个祖先类,这可能是无害的,或者似乎可以工作但实际上并没有正确的事。但是threading.Thread有特定的检查以确保它被正确初始化,所以你可能得到这样的东西:

AssertionError: Thread.__init__() was not called

如果你的父类是C扩展类,它可能没有任何祖先,它可能没有实现super,即使它确实如此,所以你通常也会得到一个错误

如果您想了解所有这些内容的工作方式(因为上面链接的文档不一定是最佳的介绍性讨论),您可能需要阅读Python's super() considered super

所以,总结一下:

super(Worker, self).__init__()