Django-admin单例模式和懒加载

Django-admin单例模式和懒加载

单例模式

python 复制代码
class Foo:
    def __init__(self):
        self.name = "张三"
        
    def __new__(cls, *args, **kwargs):
        empty_object = super().__new__(cls)
        return empty_object

obj1 = Foo()
obj2 = Foo()

当我们实例化对象时,就会在内存开一个空间

python的执行顺序是:

  • 调用__new__方法创建一个空对象
  • 调用__init__方法向空对象中赋值name="张三"
  • 所以称__new__方法为构造方法,__init__方法为初始化方法

单例模式的目的,就是让我们在创建类对象时,都使用第一次创建的类对象,而不是像上文那样每次使用时都创建一个对象

例如:

python 复制代码
import admin	# 1

admin.site		# 2

import admin	# 3

admin.site		# 4

python的执行顺序是

  • 1加载admin.py文件

  • 2实例化一个对象

  • 3当我们再次导入admin.py文件时,python不会重新加载,步骤4也就是一开始创建的admin对象,并不会重新创建一个新的对象

如何实现一个单例模式

python 复制代码
class Foo:
    instance = None

    def __init__(self):
        self.name = "张三"

    def __new__(cls, *args, **kwargs):
        if cls.instance:
            return cls.instance
        cls.instance = empty_object = super().__new__(cls)
        return empty_object


obj1 = Foo()
obj2 = Foo()

这样如果还没有创建实例化的类,instance=None,创建并同时将创建的类赋值给instance

如果已经创建对象,即instance=对象,就直接返回这个对象

可以看出两个对象的内存地址是一样的

python实例化创建对象时,不直接创建对象,而是先创建一个代理(不确定是否会使用实例化的功能)

当我们真正调用实例化的功能的时候,再真正创建对象

懒加载

在python中,我们实例化对象后,可以拿到实例化类中的变量,也可以修改

python 复制代码
class Info:
    def __init__(self):
        self.name = "张三"
        self.age = 999

obj = Info()
print(obj.name)
obj.name = "李四"
print(obj.name)

当我们访问一个实例化类中不存在的对象时,一般情况下会报错

但是如果我们在实例化的类中定义__getattr__方法,如果访问一个实例化类中不存在的对象时,会返回这个方法的return

python 复制代码
class Info:
    def __init__(self):
        self.name = "张三"
        self.age = 999

    def __getattr__(self, item):
        return "访问了不存在的类变量"


obj = Info()
print(obj.xxxxxxxxxxx)

django-admin如何实现单例模式和懒加载

django-admin源码中实例化site对象时,并不会真正实例化创建这个对象

当它调用register方法时,并没有这个方法,就会执行它的父类LazyObject中的__getattr__方法

而这里的__getattr__方法实际上时执行new_method_proxy方法

我们需要注意,父类LazyObject中有一个类变量_wrapped默认为None

当我们执行new_method_proxy方法时,会执行_setup()方法并将它赋值给_wrapped

这样当下次实例化对象时,由于_wrapped不为空,就会直接返回,不会再次创建对象,这就实现了单例模式

self._wrapped其实就是真正的实例化对象,这就实现了懒加载

相关推荐
小女孩真可爱几秒前
GPT(1)----------从零实现 GPT 模型以生成文本
人工智能·python·gpt·nlp
码云骑士2 分钟前
116-Python调用GPT-4V分析图片-Base64编码-多图-JSON结构化输出
开发语言·python·json
老郑聊AI业财智造6 分钟前
TensorFlow 技术架构与源码分析
人工智能·python·深度学习·架构·tensorflow·软件工程
民乐团扒谱机8 分钟前
【微科普】压缩感知(CS):违反了奈奎斯特采样定理?不先采集也能还原信号?大白话讲透稀疏采样、L1重建与OMP,一文吃透附代码
python·神经网络·线性代数·算法·数学建模·压缩感知·奈奎斯特
承渊政道10 分钟前
【Python编程—从入门到实践】(Python操作列表深度教程:循环、切片、元组与代码风格)
开发语言·python·pycharm·列表·元组·切片
guwentian13 分钟前
一文搞懂 AI Agent 安全护栏:用 Python 手写工具网关,把越权挡在执行层
人工智能·python·安全
布值倒区什么name18 分钟前
Pycharm2026找不到编译器 点击运行运行不了
开发语言·python·pycharm
Python私教21 分钟前
软件开发报价为什么能差 3 倍:需求范围、验收标准和变更成本怎么算
后端·python·架构
水獭比特24 分钟前
Pydantic AI 2.33.0 遇上 Anthropic SDK 1.0:别让 httpx2 在运行时才暴雷
人工智能·python
张哈大27 分钟前
完整版:对话 Agent 全链路架构详解:从 RAG 召回、Prompt 构建到 ReAct 交互落地指南
人工智能·python