特殊方法 __init__.()
2018-09-19 本文已影响0人
import_hello
转载须注明出处:简书@Orca_J35
__init__
object.__init__(self[, ...])
在新式类中, __new__
用于控制新实例的创建过程,__init__
用于控制新实例的初始化过程。如果 __new__
的返回值是当前类的实例,之后便会调用该实例的 __init__
方法,来对实例进行初始化。在完成初始化后才会将实例返回给调用者。
__init__
的实参由"实例引用"和"构造器实参列表"共同组成,也就是说 __new__
和 __init__
除了第一个参数不同之外,其余参数均相同。__init__
只能返回 None
,否则会抛出 TypeError
。
假设基类中定义了 __init__
方法,如果派生类中覆写了 __init__
方法,则在派生类的 __init__
方法中必须显式调用父类中的 __init__
方法,以确保能够正确初始化实例的基类部分,如:super().__init__([args...])
。
a. Tips
-
在旧式类中并没有
__new__
方法,只有__init__
方法,如果我们定义如下旧类:# -*- coding: utf-8 -*- # python2 class oldStyleClass: def __new__(cls): # 旧式类在构造实例的过程中,不会调用__new__方法 print("into __new__") def __init__(self): print("into __init__") oldStyleClass()
输出结果将会是:
into __init__
可见,旧式类在实例化的过程并不会调用
__new__
方法。 -
只要返回值是 cls 的实例,便会调用该实例的
__init__
方法,无论是否已经调用过:class AbstractClass(object): def __new__(cls, a, b): instance = super(AbstractClass, cls).__new__(cls) instance.__init__(a, b) return instance # 只要返回实例便会调用init,所以这里会调用两次 def __init__(self, a, b): print("into __init__") AbstractClass(1, 2)
输出:
into __init__ into __init__