Python--单例模式(__new__)
1.魔法方法__new__
“new”决定是否要使用该类的”init”方法,因为”new” 可以调用其他类的构造方法或者直接返回别的类创建的对象来作为本类的实例。
通常来说,新式类开始实例化时,”new”方法会返回cls(cls指代当前类)的实例,然后调用该类的”init”方法作为初始化方法,该方法接收这个实例(即self)作为自己的第一个参数,然后依次传入”new”方法中接收的位置参数和命名参数。但是,如果”new”没有返回cls(即当前类)的实例,那么当前类的”init”方法是不会被调用的。
调用__init__()初始化之前,先调用了__new__()方法,__new__()必须要有返回值,返回实例化出来的实例,需要注意的是,可以return父类__new__()出来的实例,也可以直接将object的__new__()出来的实例返回。
1 class Student(): 2 # Create and return a new object 分配内存方法 3 def __new__(cls, *args, **kwargs): 4 print("内存分配new") 5 # return object.__new__(cls) 6 return super().__new__(cls) 7 8 def __init__(self,name,age): 9 print("初始化init") 10 # 成员变量的初始化 11 self.name = name 12 self.age = age 13 # Student.__new__().__init__() 14 stu = Student('a',1) 15 16 print(stu.name)
2. 单例模式
保证全局对象的唯一性
如何做到对象的唯一性:
1. __new__是负责分配内存的
保证对象唯一,控制__new__方法
2.__init__方法 负责初始化
保证对象只初始化一次,控制该方法
1 class Stu(): 2 #类属性 3 #保证对象唯一 4 __single = None 5 #保证初始化唯一 6 __firstinit = False 7 # 控制对象唯一 8 def __new__(cls,*args,*kwargs): 9 #如果_single 没有值,给__single进行赋值 10 if not cls.__single: 11 cls.__single = super().__new__(cls) 12 #直接返回该对象 13 return cls.__single 14 #控制只初始化一次 15 def __init__(self,name,age): 16 #首次根据标签的值进行初始化操作 17 if not Stu.__firstinit: 18 self.name = name 19 self.age = age 20 #修改标签的值 21 Stu.__firstinit = Ture 22 #创建对象 23 a = Stu("a",1) 24 b = Stu("b",2) 25 c = Stu("c",3) 26 27 # 因为对象唯一,通过a修改,其他对象关联的值也修改 28 c.name = 'aaaaa' 29 print(a.name) 30 print(b.name) 31 print(c.name)