gpt4 book ai didi

python - 为什么类中需要 Thread.__init__()?

转载 作者:行者123 更新时间:2023-11-28 22:28:01 28 4
gpt4 key购买 nike

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

例如:

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 帖子与我的想法一致,但得到相同的堆栈错误。

最佳答案

考虑这个简化的例子:

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 子类),您可能不会知道。第二种选择:显式调用父类(super class)初始化器并让它完成它的工作。

关于python - 为什么类中需要 Thread.__init__()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43807642/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com