python 3 基础之单例模式

Posted 属于自己的世界

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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__方法,只能创建一个对象(创建多个对象实质还是第一个对象)

 

以上是关于python 3 基础之单例模式的主要内容,如果未能解决你的问题,请参考以下文章

python基础之单例设计模式

设计模式之单例模式

python 之单例模式

Python面向对象之单例模式

Python设计模式之单例模式

Python设计模式之单例模式