zoukankan      html  css  js  c++  java
  • python 3 基础之单例模式

    1、单例模式

      确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类(比如win系统的回收站),单例模式是一种对象创建型模式

    class Person(object):
        # 定义一个类属性,保存这个类创建的对象
        # instance 属性在类外不使用,可以私有
        __instance = None#None是一个空值,代表没有开辟空间
        # 定义一个属性判断是否第一次走init方法
        __is__first = True
        # 创建对象
        # 重写new方法,是为了完成单例模式中的对象地址唯一
        def __new__(cls, *args, **kwargs):
            # 判断是否通过这个类创建过对象
            if not cls.__instance:#如果not instance(即非None)
                # 创建对象保存起来
                cls.__instance = object.__new__(cls)#给instance赋值
            # 如果有值,直接返回
            return cls.__instance
        # 如果 not cls.__instance(非None),则把object.__new__(cls)的值赋给cls.__instance ,返回cls.__instance
        # 意思是如果有值,直接返回此值,代表创建第二个值开始,就一直返回的是第一个值,一直都是第一个值,所以无论怎么创建,还是只有一个值
    
        def __init__(self,name,age):
            # 判断是否第一次
            # 此处需要保证只赋值一次,第二次开始创建对象时不会重新赋值,一直用第一个值
            if Person.__is__first:
                self.name = name
                self.age = age
                # 设置类属性is__first为False
                Person.__is__first = False
    # init方法的意思是:当第一次创建对象时,先给对象赋值,赋值过后把类属性is_first的值修改为False,
    # 若第二次创建对象,代码走到这里时,不再符合if条件,无法第二次初始化属性,这就保证了这个类只有一个实例(只能创建一个对象,创建第二个开始都是无效的,打印出来的还是第一个的值)
    # 创建对象 xiaoming = Person('小明',20) xiaohonng = Person('小红',20) xiaoyang = Person('小杨',21) # 保证了对象的地址唯一 print(xiaoming.name,xiaohonng.name,xiaoyang.name)#打印结果:小明 小明 小明 print(xiaoming.age,xiaohonng.age,xiaoyang.age)#结果20 20 20

      单例模式只执行一次__new__和__init__方法,只能创建一个对象(创建多个对象实质还是第一个对象)

  • 相关阅读:
    Visitor Pattern (Visitor设计模式)
    JS DatePicker: jscalendar1.0___v1.51 (JS日期选择器)
    转:Mediator模式
    转: Debug with IIS Express
    101 LINQ Samples
    关于进程与线程:About Processes and Threads
    转:PureMVC示例 CafeTownsend
    Haskell Editor:Leksah & EclipseFP The Haskell plugin for Eclipse
    Haskell、C#、Java、C 程序执行效率比较 :Write your first parallel Haskell program
    SCJP: java exerciese 1
  • 原文地址:https://www.cnblogs.com/will-wu/p/13266726.html
Copyright © 2011-2022 走看看