用過python寫過面向對象的代碼的人對__init__方法應該很熟悉了,__init__ 方法一般用在初始化一個類實例的時候.python
例如:spa
# -*- coding: utf-8 -*- ''' Created on Mar 31, 2016 @author: fky ''' class Test(object): def __init__(self,name): self.name = name def __str__(self,): return '<Test: %s>' % self.name if __name__ == '__main__': test = Test('test1') print(test)
結果:code
<Test: test1>
這就是__init__普通用法,其實當實例化一個類最早被調用的方法 __new__ 方法。orm
class Test(object): def __new__(self,name): print('__new__') return super().__new__(self) def __init__(self,name): print('__init__') self.name = name def __str__(self,): return '<Test: %s>' % self.name if __name__ == '__main__': test = Test('test1') print(test)
結果:對象
__new__ __init__ <Test: test1>
從這個運行結果能夠看到__new__方法的調用是發生在__init__以前的。繼承
__new__ 的做用utf-8
依照Python官方文檔的說法,__new__方法主要是當你繼承一些不可變的class時(好比int, str, tuple), 提供給你一個自定義這些類的實例化過程的途徑。還有就是實現自定義的metaclass。文檔