【问题标题】:Why the need for Thread.__init__() in a Class?为什么类中需要 Thread.__init__()?
【发布时间】:2017-05-05 14:34:03
【问题描述】:

为什么我在创建threading.Thread 类时必须使用threading.Thread.__init__(self)super(ClassName, self).__init__()

例如:

class Threader(threading.Thread):
    def __init__(self, _fp, _q):
        threading.Thread.__init__(self)
        self.path = _fp
        self.queue = _q

    def run(self):
        # Do stuff

class Threader(threading.Thread):
    def __init__(self, _fp, _q):
        super(Threader, self).__init__()
        self.path = _fp
        self.queue = _q

    def run(self):
        # Do stuff

这两种方法都有效,而且做的事情大致相同。但是,如果我删除任一 .__init__() 方法,我会在堆栈中收到:from thread.start(): thread.__init__() not called

不应该定义我自己的def __init__()“替换”.__init__() 方法吗?

我已阅读 this 其他 SO 帖子,这与我的想法一致,但得到相同的堆栈错误。

【问题讨论】:

  • 为什么要优化Thread 类?为什么不直接实例化一个Thread 并给它一个可调用的委托呢? my_thread=threading.Thread(target=my_callable)
  • @jameslarge 语法对于我们使用 GUI 更新所做的事情来说更加简洁。

标签: python multithreading python-2.7


【解决方案1】:

考虑这个简化的例子:

class dog:
    def __init__(self):
        self.legs = 4
        self.sound = 'woof'

class chihuahua(dog):
    def __init__(self):
        self.sound = 'yip'
        # what's missing here?

我们创建了dog 的子类,称为chihuahua。这个类的用户会合理地期望它在所有默认方面表现得像狗,除了我们已经覆盖的特定方面(它发出的声音)。但请注意,正如您所指出的,新的子类__init__ 替换了基类__init__完全替换。与 C++ 不同,基类初始化代码不会在创建子类实例时自动调用。因此,当您创建chihuahua() 时,self.legs = 4 行永远不会运行。结果,这种狗到处乱跑,不知道它有多少条腿。因此,您可以争辩说它不是一条功能齐全的狗,如果它在尝试执行复杂的技巧时摔倒,您不应该感到惊讶。

作为子类设计者,您有两种选择来解决这个问题。首先是在子类中显式地重新实现self.legs = 4 行。好吧,这在本示例中可以正常工作,但通常不是一个好的选择,因为即使在您确实确切知道要编写什么代码以及如何维护它的情况下,它也违反了 DRY 原则。在更复杂的示例中(例如您的 Thread 子类),您可能不会知道。第二种选择:显式调用超类初始化器并让它做它的事情。

【讨论】:

    【解决方案2】:

    定义您自己的__init__ 会覆盖基类。但是基础__init__ 为使线程可运行所做的所有工作又如何呢?它通常会创建的所有变量和状态都丢失了。除非您自己破解所有这些内容(以及为什么要这样做?),否则线程当然是完全无法运行的。

    当然,并非所有课程都需要__init__,但绝大多数课程都需要。即使对于那些不这样做的人,调用__init__ 也是无害的——它只是转到object.__init__ 并且在实现者认为__init__ 毕竟有用的情况下为子类提供未来证明。

    【讨论】:

      猜你喜欢
      • 2020-11-06
      • 1970-01-01
      • 2019-04-18
      • 1970-01-01
      • 2013-08-20
      • 2015-05-26
      • 1970-01-01
      • 2010-10-19
      • 2010-10-14
      相关资源
      最近更新 更多