1. 程式人生 > >__init__和__new__的異同

__init__和__new__的異同

例項化類的流程:

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。