Python学习笔记--单例&__new__方法

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()

猜你喜欢

转载自blog.csdn.net/qq_38930129/article/details/80686628
今日推荐