new和单例模式
new
new()方法是构造方法,init()方法是初始化方法,new()在init()之前执行,由new()创建一个对象,供init()初始化。
new()才是真正的实例化方法,为类提供外壳制造出实例框架,然后调用该框架内的构造方法init()使其丰满。
class A: def __init__(self): print('init function') def __new__(cls, *args, **kwargs): print('new function') return object.__new__(A) a = A()
#先执行new()方法,再执行init()方法
out:new function
init function
单例模式
下面创建的两个对象其实在同一块内存,即同一对象。
class Singleton: def __new__(cls, *args, **kw): if not hasattr(cls, '_instance'): cls._instance = object.__new__(cls) return cls._instance one = Singleton() two = Singleton() two.a = 3 print(one.a) # 3 # one和two完全相同,可以用id(), ==, is检测 print(id(one)) # 29097904 print(id(two)) # 29097904 print(one == two) # True print(one is two)