当前位置: 首页 > 后端技术 > Python

单例设计模式

时间:2023-03-26 13:48:36 Python

好麦网IT技术交易平台目标:单例设计模式__new__方法Python中的单例模式是针对特定问题的成熟解决方案。设计模式的使用是为了可重用的代码,让代码更容易被别人理解,保证代码的可靠性。类名()每次执行返回的对象实例只有一个,内存地址相同单例设计模式应用场景音乐播放器对象回收站对象打印机对象2.__new__方法使用类名()时创建对象时,Python解释器会先调用__new__方法为对象分配空间,然后调用__init__()方法初始化对象。__new__是对象基类提供的内置静态方法。它的主要功能是在内存中分配两个对象的引用返回对象,Python解释器得到对象的引用后,将引用作为第一个参数传递给类MusicPlayer(object)的__init__方法:def__new__(cls,*args,**kwargs):print("Createobject,allocatespace")def__init__(self):print("Initializeobject")player=MusicPlayer()print(player)'''运行结果:createobject,allocatespace:可以看出在实例化对象时,首先调用new方法为对象开辟空间None:因为重写了new方法,new方法需要将对象的地址传递给init,重写的时候没有完成,所以没有初始化'''重写__new__方法的代码很固定,必须返回super().__new__(cls)否则Python解释器将得不到分配的引用空间,并且不会调用对象的初始化方法注:__new__是静态方法,调用classMusicPlayer(object)时需要主动传递cls参数:def__new__(cls,*args,**kwargs):#创建对象时,会自动调用new方法print("Createobject,assignSpace")#ins为对象分配空间tance=super().__new__(cls)#返回对象引用returninstancedef__init__(self):print("initializeobject")player=MusicPlayer()print(player)'''运行结果:创建对象,分配空间初始化Theobject<__main__.MusicPlayerobjectat0x000001DC63B9FF10>'''Singleinstance——让类创建的对象在系统中只有一个实例来定义一个类属性,初始值为None,用于记录单例对象的引用复用如果类属性为None,则编写新的方法,调用父类方法分配空间,并将结果记录在类属性中返回记录在类属性中的对象引用1#Singletondesignpattern2classMusicPlayer(object):3instance=None#记录对象的地址4def__new__(cls,*args,**kwargs):5#判断对象是否为空,如果为空,则为其分配一个地址6ifcls.instanceisNone:7#为对象分配空间8cls.instance=super().__new__(cls)9#返回对象引用10returncls.instance11#如果部分为空,则返回第一个对象的地址12else:13returncls.instance14def__init__(self):15pass1617player_1=MusicPlayer()#<__main__.MusicPlayerobjectat0x00000282C8B7FDF0>18print(player_1)1920player_2=MusicPlayer()#<__main__.MusicPlayerobjectat0x00000282C8B7FDF0>21print(player_2)singletondesignpatterncaseonlyexecutetheinitializationactiononlyexecutetheinitializationactiononce需求:让初始化动作只执行一次方案定义一个类属性init_flag来标记初始化动作是否执行过,初始值为False中init方法,判断init_flag,如果为False,则执行初始化动作,然后将init_flag设置为True,这样再次调用__init__方法时,就不会执行初始化动作了1#初始化动作只执行一次2classMusicPlayer(object):3instance=None#记录对象的地址4init_flag=False#标记是否执行了初始化动作5def__new__(cls,*args,**kwargs):6#判断对象是否为空,如果为空则为其分配一个地址7ifcls.instanceisNone:8#为对象分配空间9cls.instance=super().__new__(cls)10#返回对象的引用11returncls.instance12#如果该部分为空,则返回第一个对象的地址13else:14returncls.instance15def__init__(self):16#判断是否执行了初始化动作17ifMusicPlayer.init_flag:18return19#如果没有,执行初始化动作20print("Initializetheplayer")21#修改类属性的flag(init_flag)22MusicPlayer.init_flag=True2324player_1=MusicPlayer()#<__main__.MusicPlayerobjectat0x00000282C8B7FDF0>25print(player_1)26player_2=MusicPlayer()#<__main__.MusicPlayerobjectat0x00000282C8B7FDF0>27print(player_2)28player_3=MusicPlayer()#<__main__.MusicPlayerobjectat0x00000282C8B7FDF0>23'3'1print(Result:32Initialize播放器33<__main__.MusicPlayerobjectat0x0000029ECB252F10>34<__main__.MusicPlayerobjectat0x0000029ECB252F10>35<__main__.MusicPlayerobjectat0x0000029ECB252F10>36Action'''Initializeonlyonce