Python—设计模式

Posted wf-aiyouwei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

以上是关于Python—设计模式的主要内容,如果未能解决你的问题,请参考以下文章

python设计模式浅析

Python工程之设计模式总结Python之23种设计模式

python23种设计模式

python——设计模式

设计模式及Python实现

Python—设计模式