[英]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.