Python—设计模式

####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

原文地址:https://www.cnblogs.com/wf-aiyouwei/p/9683922.html