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()
Python学习笔记--单例&__new__方法
于 2018-06-13 23:20:27 首次发布