1--单例设计模式

。--目的--让类创建的对象,在系统张总只有唯一的一个实例
。--使用设计模式 是为了可重用代码、让代码更容易被他人理解、保证代码可靠性



2--__new__方法

。--使用类名()创建对象时,Python的解释器首先会调用 __new__ 方法为对象分配空间
。--__new__ 是一个由object基类提供的内置的静态方法,主要作用:

--在内存中位对象分配空间
--返回对象的引用

。--Python的解释器获得对象的引用后,将引用作为第一个参数,传递给 __init__ 方法

。--重写 __new__ 方法的代码非常固定
。--重写 __new__ 方法一定要 return super().__new__(cls)
。--否则Python的解释器得不到分配了空间的对象引用,就不会调用对象的初始化方法
**注意:__new__ 是一个静态方法,在调用时需要主动传递cls参数


3--重写__new__ 方法,实现单例

。--重写new方法 

 class MusicPlayer(object): 

  

  

 def __new__(cls,*args,**kwargs): 

 #创建对象时,new方法会被自动调用 

 print("创建对象,分配空间") 
  

  

 #为对象分配空间 

 instance=super.__new__(cls) 

  

 #放回对象的引用 

 return instance 

  

 def __init__ (self): 

  

 print("播放器初始化") 

  

 player=MusicPlayer()




。--实现单例

class MusicPlayer(object): 

  

 instance=None 

  

 def __new__(cls,*args,**kwargs): 

 #创建对象时,new方法会被自动调用 

 print("创建对象,分配空间") 
  

  

 if cls.instace is None: 

  

 #为对象分配空间 

 cls.instance=super.__new__(cls) 

  

 #放回对象的引用 

 return cls.instance 

  

  

 def __init__ (self): 

  

 print("播放器初始化") 

  

 player=MusicPlayer()




4--初始化动作只执行一次

。--在每次执行 类名() 创建对象时,Python的解释器都会自动调用两个方法:

--__new__方法,分配空间
--__init__方法,对象初始化

。--在上面,对__new__方法改造之后,每次都会第一次被创建对象的引用
。--但是:初始化方法还会再次被调用

。--需求:让初始化动作只被执行一次

--定义一个类属性,init_flag标记是否执行过初始化动作,初始值为false
--在__init__方法中,判断init_flag,如果为False就执行初始化动作
--然后将init_flag设置为Ture
--这样,再次调用__init__方法时,初始化动作就不会被再次执行了

例:

class MusicPlayer(object): 

  

 instance=None 

 init_flag=False 

  

 def __new__(cls,*args,**kwargs): 

 #创建对象时,new方法会被自动调用 

 print("创建对象,分配空间") 
  

  

 if cls.instace is None: 

  

 #为对象分配空间 

 cls.instance=super.__new__(cls) 

  

  

 #放回对象的引用 

 return cls.instance 

  

  

 def __init__ (self): 

  

 if MusicPlayer.init_flag: 

 return 

  

 print("播放器初始化") 

  

 MusicPlayer.init_flag=Ture 

  

  

  

  

 player=MusicPlayer()