zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    gridFS-Nginx的安装与使用
    centos下利用phantomjs来完成网站页面快照截图
    linux下安装php的svn模块
    在Thinkphp3.1中使用Mongo的具体操作
    CentOS 6.4安装mongo的php扩展包
    在centos6.3下安装php的Xdebug
    在yum安装lamp的环境下安装coreseek以及php的sphinx扩展
    CentOS 6.4下通过YUM快速安装配置LAMP服务器(Apache+PHP5+MySQL)
    微信中web页面实现和公众号中查看图片一样的效果
    ionic学习教程地址梳理
  • 原文地址:https://www.cnblogs.com/wf-aiyouwei/p/9683922.html
Copyright © 2011-2022 走看看