我在python 2.6 man中看到了这句话:
class threading.Thread(group=None, target=None, name=None, args=(), kwargs={})
.
.
.
如果子类重写构造函数,则必须确保在对线程执行任何其他操作之前调用基类构造函数(Thread.__init__()
)。
我只是想知道为什么?
答案 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__
调用超类,除了非常特殊的情况(例如“透明混合类” - 如果你不知道它们是什么,你很可能不需要知道)。一般规则将始终是“超类初始化在此特定版本中可能或可能不重要,但它永远不会受到伤害,并且通常是必要的和/或有用的”! - )