必须在我重写的构造函数中调用(Thread .__ init__),但为什么呢?

时间:2010-05-15 20:55:54

标签: python

我在python 2.6 man中看到了这句话:

class threading.Thread(group=None, target=None, name=None, args=(), kwargs={}) 
.
.
.

如果子类重写构造函数,则必须确保在对线程执行任何其他操作之前调用基类构造函数(Thread.__init__())。 我只是想知道为什么?

2 个答案:

答案 0 :(得分:3)

因为Thread.__init__设置了一些内部变量,如果省略调用,这些变量将是未定义的。一般来说,在所有情况下调用超级构造函数是一个好习惯,除非有充分的理由不这样做。

答案 1 :(得分:2)

如果你想知道“超类的__init__为我做的具体细节”,你可以随时学习the sources并查看,例如......:

    self.__target = target
    self.__name = str(name or _newname())
    self.__args = args
    self.__kwargs = kwargs
    self.__daemonic = self._set_daemon()
    self.__ident = None
    self.__started = Event()
    self.__stopped = False
    self.__block = Condition(Lock())
    self.__initialized = True

初始化的确切超私有变量集当然可以从python的一个版本到下一个版本有所不同,但显然总会有一些这样的变量和/或其他初始化的东西在基类的__init__中执行。您只需要知道自己指令的所有细节(您应该“尊重”您选择编程的抽象层,但是,如果您是一位聪明且经验丰富的开发人员,那么您了解那些更好明智地隐藏抽象层,你会越尊重它们; - )。

一般来说,规则应始终为每个__init__调用超类,除了非常特殊的情况(例如“透明混合类” - 如果你不知道它们是什么,你很可能不需要知道)。一般规则将始终是“超类初始化在此特定版本中可能或可能不重要,但它永远不会受到伤害,并且通常是必要的和/或有用的”! - )