__init__和__new__的異同
阿新 • • 發佈:2018-12-27
例項化類的流程:
1.p = Person(name, age)
2.首先執行使用name和age引數來執行Person類的__new__方法,這個__new__方法會 返回Person類的一個例項(通常情況下是使用 super(Persion, cls).__new__(cls, … …) 這樣的方式),
3.然後利用這個例項來呼叫類的__init__方法,上一步裡面__new__產生的例項也就是 __init__裡面的的 self
所以,__init__ 和 __new__ 最主要的區別在於:
1.__init__ 通常用於初始化一個新例項,控制這個初始化的過程,比如新增一些屬性, 做一些額外的操作,發生在類例項被建立完以後。它是例項級別的方法。
2.__new__ 通常用於控制生成一個新例項的過程。它是類級別的方法。
__new__方法的作用:
1. 依照Python官方文件的說法,__new__方法主要是當你繼承一些不可變的class時(比如int, str, tuple), 提供給你一個自定義這些類的例項化過程的途徑。
class Demo(int): def __new__(cls, value): return super().__new__(cls,abs(value)) Demo(-3) >>> 3
2. 關於自定義metaclass。