Python 线程在类中是如何工作的?

Python 线程在类中是如何工作的?,python,multithreading,Python,Multithreading,所以我找到了这个代码: from threading import Thread class Example(Thread): def __init__(self): Thread.__init__(self) def run (self): print("It's working!") Example().start() 它使用另一个线程打印“它正在工作”,但这是如何工作的呢?我在类中找不到关于线程的任何信息。它与超类有关吗?您的\uuu i

所以我找到了这个代码:

from threading import Thread
class Example(Thread):
    def __init__(self):
        Thread.__init__(self)

    def run (self):
        print("It's working!")
Example().start()

它使用另一个线程打印“它正在工作”,但这是如何工作的呢?我在类中找不到关于线程的任何信息。它与超类有关吗?

您的
\uuu init\uuu
方法是完全冗余的。实际上,您正在用自己的实现替换
线程。
,其中您自己的实现只调用
线程。
。如果将其删除,则不会有任何更改:

class Example(Thread):
    def run (self):
        print("It works!")
只需调用
Example.run()
方法,因为您使用以下命令启动了线程:

start()

启动线程的活动

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

另见:

run()

方法表示线程的活动

您可以在子类中重写此方法。标准的
run()
方法调用传递给对象构造函数的可调用对象作为目标参数(如果有),并分别使用args和kwargs参数中的顺序参数和关键字参数


您的
\uuuu init\uuuu
方法与此无关

现在,如果您在
线程
子类中创建了一个
\uuuuuuuu init\uuuuuu
方法,然后没有确保
线程被调用,那么您就阻止了类设置重要的实例信息,破坏了实例:

>>> 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
>>从线程导入线程
>>>类示例(线程):
...     def运行(自):
...         打印(“它有效!”)
... 
>>>示例().start()
它起作用了!
>>>类Broker示例(线程):
...     定义初始化(自):
...         # 什么也不做
...         通过
...     def运行(自):
...         打印(“它有效!”)
... 
>>>broken示例().start()
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/…/lib/python2.7/threading.py”,第737行,开始
raise RUNTIMERROR(“未调用线程.\uuuuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu())
运行时错误:未调用线程
因为这是一个常见的错误,所以
Thread.start
方法会抛出一个自定义异常,明确地告诉您
Thread.\uuuuu init\uuuuu
未执行。

方法是在初始化对象时调用的。当您执行-
Thread.\uuuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

正如在评论中所说,您可以删除它,并且功能应该保持不变。在您的类中,
\uuuuu init\uuuu()
是完全冗余的

执行此操作时将调用此方法-

Example()
示例()
创建新对象时

Example()
对象上执行-
.start()
操作时,将调用
run()
方法。这是通过方法完成的,从-

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!

你确定吗?你再试了吗?也许你犯了别的错误。你在这里做的事没有什么特别的。您是否创建了一个
\uuuuu init\uuuu
方法,然后没有调用
线程。\uuuuu init\uuuu
?请看一下(网上还有很多可用的方法)。谢谢!那么,基本上,示例中的线程(线程)已经初始化了一个线程?Thread类如何知道要运行什么函数?@MorrisCasper:Thread
类提供了所有功能,您只需要提供一个
run()
方法。这是有文档记录的,调用
.start()
将创建一个新线程,然后运行
run
方法。如果在示例类中创建一个start函数,会发生什么情况?@MorrisCasper:您将覆盖
thread.start()
方法,如果不调用原始线程,线程将不会启动,也不会调用
run
。@MartijnPieters您好,您可以扩展这一部分吗:
然后不确定线程。调用了uuu init uuuuuuuuu,那么您阻止类设置重要的实例信息,中断实例
您是指具有默认值的关键字参数,例如:
self.\uu ident=None self.\uuu start=Event()self.\uuu stopped=False self.\uuuu block=Condition(Lock())self.\uu initialized=True
,这些参数在构造函数中没有调用?