我很好奇为什么当我的类继承自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()
答案 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__()