繁体   English   中英

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

[英]Calling a super class constructor when inheriting from 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()

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

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

如果您的父类是常规的新式Python类,则执行此错误通常意味着您跳过了一个祖先类,这可能是无害的,或者似乎可以工作,但实际上并没有做正确的事情。 但是threading.Thread具有特定的检查以确保正确初始化,因此您可能会得到如下所示的信息:

AssertionError: Thread.__init__() was not called

如果您的父类是C扩展类,则它可能没有任何祖先,并且即使实现了它也可能不会实现super ,因此您通常也会以这种方式得到错误。

如果您想了解所有方法的工作原理,则可能需要阅读被认为是super的Python的super() (因为上面链接的文档不一定是最佳的入门讨论)。

因此,总而言之:

super(Worker, self).__init__()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM