Django-admin单例模式和懒加载

devtools/2024/11/15 6:06:51/

Django-admin单例模式和懒加载

单例模式

python">class Foo:def __init__(self):self.name = "张三"def __new__(cls, *args, **kwargs):empty_object = super().__new__(cls)return empty_objectobj1 = Foo()
obj2 = Foo()

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

python的执行顺序是:

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

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

例如:

python">import admin	# 1admin.site		# 2import admin	# 3admin.site		# 4

python的执行顺序是

  • 1加载admin.py文件

  • 2实例化一个对象

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

如何实现一个单例模式

python">class Foo:instance = Nonedef __init__(self):self.name = "张三"def __new__(cls, *args, **kwargs):if cls.instance:return cls.instancecls.instance = empty_object = super().__new__(cls)return empty_objectobj1 = Foo()
obj2 = Foo()

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

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

在这里插入图片描述

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

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

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

懒加载

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

python">class Info:def __init__(self):self.name = "张三"self.age = 999obj = Info()
print(obj.name)
obj.name = "李四"
print(obj.name)

在这里插入图片描述

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

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

python">class Info:def __init__(self):self.name = "张三"self.age = 999def __getattr__(self, item):return "访问了不存在的类变量"obj = Info()
print(obj.xxxxxxxxxxx)

在这里插入图片描述

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

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

当它调用register方法时,并没有这个方法,就会执行它的父类LazyObject中的__getattr__方法
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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

在这里插入图片描述

我们需要注意,父类LazyObject中有一个类变量_wrapped默认为None
在这里插入图片描述

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

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

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

在这里插入图片描述


http://www.ppmy.cn/devtools/24428.html

相关文章

【Jenkins】持续集成与交付 (十):Tomcat 8.5.99 安装和配置详解

🟣【Jenkins】持续集成与交付 (十):Tomcat 8.5.99 安装和配置详解 一、安装 Tomcat 8.5.991.1 上传 Tomcat 压缩包1.2 安装 JDK(如果尚未安装)1.3 解压 Tomcat 压缩包1.4 创建目标目录并移动 Tomcat 文件1.5 启动 Tomcat二、配置 Tomcat 用户角色权限2.1 添加用户及权限…

(商汤商量、通义、AI Gear、腾讯混元、ChatMindAI)分享好用的ChatGPT

目录 1、商汤商量语言大模型 2、通义 3、AI Gear 4、腾讯混元

【PostgreSQL】pg触发器介绍

注: 本文为云贝教育 刘峰 原创,请尊重知识产权,转发请注明出处,不接受任何抄袭、演绎和未经注明出处的转载。 触发器是在对指定表执行指定更改操作(SQL INSERT、UPDATE、DELETE 或 TRUNCATE 语句)时自动运行的一组操作…

【Spring AI】09. ETL 管道

文章目录 ETL PipelineAPI 概述入门指南ETL 接口和实现DocumentReaderJsonReaderTextReaderPagePdfDocumentReaderParagraphPdfDocumentReaderTikaDocumentReader DocumentTransformerTextSplitterTokenTextSplitterContentFormatTransformerKeywordMetadataEnricherSummaryMet…

docker部署prometheus

概述 Prometheus是一个开源的服务监控系统和时序数据库,专为云计算环境设计。它提供了通用的数据模型和快捷的数据采集、存储和查询接口。Prometheus的核心组件Prometheus server会定期从静态配置的监控目标或者基于服务发现自动配置的目标中拉取数据。当新拉取到的…

企业营销战略新思考:营销5.0与开源AI智能名片S2B2C商城小程序引领私域流量经营新纪元

随着互联网的深入发展,企业营销战略已经不再是单一、静态的规划,而是一个持续进化、与市场紧密相连的动态过程。在这个过程中,营销5.0和开源AI智能名片S2B2C商城小程序的结合,为企业营销战略注入了新的活力,也为私域流…

进迭时空宣布开源RISC-V芯片的AI核心技术

仟江水商业电讯(4月29日 北京 委托发布)4月29日,在“创芯生生不息——进迭时空2024年度产品发布会”上,进迭时空CEO、创始人,陈志坚博士宣布将开源进迭时空在自研RISC-V AI CPU上的核心技术,包括AI扩展指令…

Python装饰器:深入解析与实战应用

Python装饰器:深入解析与实战应用 在Python编程中,装饰器(Decorators)是一个强大而灵活的工具,它允许程序员在不修改现有函数或类代码的情况下,为其添加新的功能。装饰器不仅简化了代码结构,还…