####python的设计模式###

 

设计模式:

设计模式是前人的总结和经验的提炼,通常被人们广为流传

的设计模式,都是针对某一特定问题的成熟解决方案

 

单例设计模式:

 

一:

 

创建对象的时候:

1.为对象分配空间:__new__   最先被调用

2.对象初始化:__init__

 

创建对象的时候,python解释器首先会首先调用__new__方法

为对象分配空间,这个方法是一个由object基类提供的内置的静态方法

主要有两个作用:

在内存中为对象分配空间

返回对象的引用

 

对象初始化:python解释器获得对象的引用后,将第一个参数,传递给__init__

"""
class MusicPlayer(object):
    def __new__(cls, *args, **kwargs):
        #第一个参数cls:哪一个类调用就传递哪一个类
        #第二个参数:是一个多值元组参数
        #第三个参数:是一个多值的字典参数
        #1.创建对象时,new方法会被自动调用
        print '创建对象,分配空间' #重写了父类的方法
        #2.为对象分配空间
        #__new__是一个静态的方法,在调用的时候,第一个参数是cls
        instance = object.__new__(cls)
 
    def __init__(self):
        print '初始化'

 

 

二:

class MusicPlayer(object):
    instance = None
    def __new__(cls, *args, **kwargs):
        if cls.instance is None:
            cls.instance = object.__new__(cls)
        return cls.instance
 
player1 = MusicPlayer()
print player1
player2 = MusicPlayer()
print player2
 
"""

重写__new__方法的代码非常固定:

继承自父类方法

返回父类方法调用__new__方法的结果

重写__new__方法一定要return object.__new__(cls)

否则,python的解释器得不到分配空间的对象的引用,就不会调用对象的初始化方法


python中的单例:

单例:让类创建的对象,在系统中只有唯一的一个实例

    1.定义一个类属性,初始值为None,用于记录单例对象的引用

(因为当一个类定义完成运行程序的时候,内存中并没有这个类创建的对象,

我们需要调用创建对象的方法,内存中才会有第一个对象)


    2.重写__new__方法

    3.如果类属性 is None,调用父类方法分配空间,并在类属性中记录结果

    4.返回类属性中记录的对象的引用

"""

 

 

三:

 

只执行一次初始化工作

在每次使用 类名() 创建对象时,python的解释器都会自动调用两个方法

    __new__分配空间

    __init__对象初始化

但在上一小结中,__new__方法改造之后,每次都会得到第一次被创建对象的引用

但是:初始化方法还是会被再次调用

 

需求:让初始化方法只执行依次

解决办法:

1.定义一个类属性init_flag标记是否执行过初始化动作,初始值为false

2.在__init__方法中,判断init_flag,如果为False就执行初始化动作

3.然后将init_flag设置为true

"""
class MusicPlayer(object):
    instance = None
    init_flag = False
 
    def __new__(cls, *args, **kwargs):
        if cls.instance is None:
            cls.instance = object.__new__(cls)
        return cls.instance
 
    def __init__(self):
        if MusicPlayer.init_flag:
            return
        print '初始化播放器'
 
player1 = MusicPlayer()
print player1
player2 = MusicPlayer()
print player2