__new__是一個類方法,它返回的是一個實例
__init__是一個實例方法,它什麼都不返回(如果返回None之外的東西會報錯)
事實上,創建一個類分2步。第一步,創建類的對象,就是new;第二步對類進行初始化,就是init
只有在__new__返回一個新創建屬於該類的實例時,當前類的 __init__纔會被調用。(換言之,如果new方法沒有return一個屬於該類的實例,則init方法不會被執行;或者__new__方法返回一個已經存在的實例,則__init__方法也不會被調用)
所以單例模型可以這樣創建:
class Animal(object):
__instance = None
def __new__(cls):
if cls.__instance == None:
cls.__instance = object.__new__(cls)
return cls.__new__(cls)
else:
return cls.__instance
a = Animal()
print(id(a))
b = Animal()
print(id(b))
print(id(a)==id(b))