0

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

#!/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()
4

1 回答 1

2

我很好奇为什么我不能调用super(Thread, self).__init__()而不是Thread.__init__(self)当我的类继承自Thread.

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

如果你的父类是一个常规的新式 Python 类,做错这件事通常意味着你跳过了一个祖先类,这可能是无害的,或者可能看起来有效但实际上并没有做正确的事情。但是threading.Thread有特定的检查来确保它被正确初始化,所以你可能会得到这样的东西:

AssertionError: Thread.__init__() was not called

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

如果您想了解所有这些是如何工作的(因为上面链接的文档不一定是最好的介绍性讨论),您可能想阅读Python 的 super() 被认为是超级的。

所以,总结一下:

super(Worker, self).__init__()
于 2013-03-01T01:47:27.400 回答