1. 单例模式的介绍

  • 一个类始终只有一个实例
  • 当你第一次实例化这个类的时候 就创建一个实例化的对象,当你之后再来实例化的时候 就用之前创建的对象

2. 单例模式的作用

  • 实现数据的统一
  • 单例模式的使用场景: 把Django中的配置文件想象成一个类,此时所有的.py文件使用的都是该类实例化出来的同一个对象

3. 单例模式的写法

  • 写法一 -> 通过 __new__ 方式实现

class Person:
    __instance = False

    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __new__(cls, *args, **kwargs):
        if cls.__instance:  # 如果创建过对象始终返回上一个创建的对象
            return cls.__instance
        cls.__instance = object.__new__(cls)  # 创建第一个对象
        return cls.__instance

k = Person('Kevin', 22)
y = Person('Yeung', 18)

print(k.name)  # Yeung
print(y.name)  # Yeung
print(k)  # <__main__.Person object at 0x0000028763FC1FD0>
print(y)  # <__main__.Person object at 0x0000028763FC1FD0>
print(k == y)  # True

  • 写法二 -> 通过模块的方式实现 -> Django 常用的写法

    • 通过Python中模块加载只加载一次的特性实现单例模式
    • 导入的时候必须导入一个对象,而不是一个类,不然就无法实现单例模式,导入一个对象是因为由始至终都是使用该类实例化出来的同一个对象

singleton_mode.rar

single.py

class Single(object):
    def __init__(self):
        self.list = []

    def add_data(self, data):
        self.list.append(data)


site = Single()

# a1.py

from single import site  # 必须导入类所实例化出来的对象

site.add_data(1)

print(site.list)  # [1]

# a2.py

from single import site  # 必须导入类所实例化出来的对象

site.add_data(2)

print(site.list)  # [1, 2]

# main.py

from app01 import a1  # 第一次加载 site 对象
from app02 import a2  # 因为 a1 已经加载了 site 对象,所以 site 对象不会重新加载,而是使用同一个 site 对象,因为 Python 中模块加载只加载一次

from single import site  # 这里只是为了查看数据所以才导入 site 对象

print(site.list)  # [1, 2]