Thread .__ init __(self)在一个类中是如何工作的?

时间:2015-08-06 09:10:36

标签: python multithreading

所以我找到了这段代码:

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)的任何内容。它与超类有关吗?

2 个答案:

答案 0 :(得分:5)

您的__init__方法完全是多余的。您实际上已将Thread.__init__()替换为您自己的实现,您自己的实现只需调用Thread.__init__()。如果你删除它,什么都不会改变:

class Example(Thread):
    def run (self):
        print("It works!")

您只需调用Example.run()方法,因为您使用Thread.start() method启动了帖子:

  

start()
  开始线程的活动。

     

每个线程对象最多只能调用一次。它安排在一个单独的控制线程中调用对象的run()方法。

另见Thread.run() documentation

  

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() -

中的documentation方法完成的
  

开始()

     

开始线程的活动。

     

每个线程对象最多只能调用一次。它安排对象的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!