所以我找到了这段代码:
from threading import Thread
class Example(Thread):
def __init__(self):
Thread.__init__(self)
def run (self):
print("It's working!")
Example().start()
它打印出“它正在工作!”使用另一个线程,但这是如何工作的?我在类中找不到Thread .__ init __(self)的任何内容。它与超类有关吗?
答案 0 :(得分:5)
您的__init__
方法完全是多余的。您实际上已将Thread.__init__()
替换为您自己的实现,您自己的实现只需调用Thread.__init__()
。如果你删除它,什么都不会改变:
class Example(Thread):
def run (self):
print("It works!")
您只需调用Example.run()
方法,因为您使用Thread.start()
method启动了帖子:
start()
开始线程的活动。每个线程对象最多只能调用一次。它安排在一个单独的控制线程中调用对象的
run()
方法。
run()
表示线程活动的方法。您可以在子类中覆盖此方法。标准
run()
方法调用传递给对象构造函数的可调用对象作为目标参数(如果有),分别从args和kwargs参数中获取顺序和关键字参数。
您的__init__
方法与此无关。
现在,如果您在__init__
子类中创建了Thread
方法,然后不确保调用Thread.__init__
,那么您阻止了该类设置重要的实例信息,打破实例:
>>> from threading import Thread
>>> class Example(Thread):
... def run (self):
... print("It works!")
...
>>> Example().start()
It works!
>>> class BrokenExample(Thread):
... def __init__(self):
... # not doing anything
... pass
... def run (self):
... print("It works!")
...
>>> BrokenExample().start()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/.../lib/python2.7/threading.py", line 737, in start
raise RuntimeError("thread.__init__() not called")
RuntimeError: thread.__init__() not called
由于这是一个常见错误,Thread.start
方法会抛出一个自定义异常,明确告诉您Thread.__init__
未执行。
答案 1 :(得分:2)
__init__()
方法。当你做 - Thread.__init__(self)
时,它只是调用父类'__init__()
方法。
如评论中所述,您可以将其删除,功能应保持不变。在您的班级中,__init__()
完全是多余的。
当你这样做时会调用这个方法 -
Example()
为Example()
创建新对象时。
当您在run()
对象上执行.start()
时,会调用Example()
方法。这是通过Thread.start()
-
开始()强>
开始线程的活动。
每个线程对象最多只能调用一次。它安排对象的run()方法在一个单独的控制线程中调用。
再添加一个打印语句并将Example().start()
分成两行,以便您清楚地理解这一点 -
>>> from threading import Thread
>>> class Example(Thread):
... def __init__(self):
... Thread.__init__(self)
... print("In __init__")
... def run (self):
... print("It's working!")
...
>>> e = Example()
In __init__
>>> e.start()
It's working!