__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))