广告
返回顶部
首页 > 资讯 > 后端开发 > Python >django源码分析 LazySetti
  • 465
分享到

django源码分析 LazySetti

源码djangoLazySetti 2023-01-31 00:01:25 465人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

一、django中通过LazySetting对象来获取项目的配置,LazySetting对象有什么特性?为什么使用这个对象? LazySetting顾名思义,就是延迟获取配置内容。比如,我们定义了一个对象A,并对其添加了一些属性,对A初始

一、django中通过LazySetting对象来获取项目的配置,LazySetting对象有什么特性?为什么使用这个对象?

LazySetting顾名思义,就是延迟获取配置内容。比如,我们定义了一个对象A,并对其添加了一些属性,对A初始化时,我们将A的属性的值设置为空,当我们要访问A其中的一个属性时,此时属性的值为空,我们才加载属性的值,并将空值设置为对应的值,返回属性值,下次获取属性值时,属性值不为空,直接返回属性值。

为什么要使用LazySetting? 

Django项目在初始化的时候, 通过LazySetting,我们就可以在djanGo获取某个配置的值之前,将配置的值先自定义为某个值,django再去获取该配置的值的时候,配置已经有了值,直接返回该配置的值。

二、django是如何实现LazySetting对象的?

1. 在说LazySetting对象之前,我们先看一下python的类属性的查找方式:

在查找一个实例化的类属性的时候

  1. 首先查找这个类的实例属性是否存在,存在直接返回
  2. 如果类的实例属性中不存在,则在类的类属性中查找,类属性中存在,则返回
  3. 如果类属性中也不存在,若定义了__getattr__方法,则根据__getattr__方法获取属性

python中类属性和实例属性会记录在类的一个内置变量__dict__中,类属性和实例属性有各自维护的__dict__

class A:
    a = '类属性'

    def __init__(self):
        self.a = '实例属性'

print(A.__dict__)
print(A().__dict__)

输出的结果为

{'__module__': '__main__', 'a': '类属性', '__init__': <function A.__init__ at 0x04BBAB28>, '__dict__': <attribute '__dict__' of 'A' objects>, '__weakref__': <attribute '__weakref__' of 'A' objects>, '__doc__': None}
{'a': '实例属性'}

 

注意的是,类属性里面不只有a属性,还有一些其他类有关的属性

我们可以看到,类属性里面a的值和实例属性里面a的值不一样。类属性和实例属性是分别维护的。

2. 下面我们写几个实例化的类查找属性的例子

第一个例子

class A:
    a = 'Aa'
    b = 'Bb'

    def __init__(self):
        self.a = 'aa'

obj = A()
print(obj.a)
print(obj.b)

 

输出的结果是(先在实例属性中查找,找不到,再到类属性中查找)

aa
Bb

 

如果我们print(obj.c)则会报错,因为在类属性中和实例属性中都找不到c

第二个例子

class A:
    a = 'Aa'
    b = 'Bb'

    def __init__(self):
        self.a = 'aa'

    def __getattr__(self, item):
        return 'cc'

obj = A()
print(obj.a)
print(obj.b)
print(obj.c)

 

输出的结果和上面类似,只是print(obj.c)不报错了,因为我们定义了__getattr__方法,实例属性中和类属性中都找不到时,就会使用这个方法获取属性

aa
Bb
cc

 

3. django的LazySetting类的实现

LazySetting类的实现就是通过定义__getattr__方法实现的,LazySetting类的__getattr__源码如下

def __getattr__(self, name):
    """Return the value of a setting and cache it in self.__dict__."""
    if self._wrapped is empty:
        self._setup(name)
    val = getattr(self._wrapped, name)
    self.__dict__[name] = val
    return val

 

我们在LazySetting对象中查找一个属性的时候,先在实例属性(self.__dict__)中查找,没有找到话,通过__getattr__方式获取,获取到后,将属性值保存到实例属性中,这样就实现了属性在使用的时候

再获取,然后保存。我们还可以再获取属性之前,先将属性的值自定义,这样就可以不用使用__getattr__的方式来获取默认的值。

 三、总结

延迟加载的方式,可以在编程优化我们类的初始化动作,比如,我们创建了一个类有很多属性,这些属性的值都需要通过计算的方式获取,我们在初始化的时候,就要把属性的值计算出来,这些计算出来属性,我们后面有可能能会用不到,这样的话,类的初始化就计算属性的值方式会浪费大量的计算机资源;使用延迟加载的方式,就可以很好的解决这种问题,到使用属性值的时候再获取。

--结束END--

本文标题: django源码分析 LazySetti

本文链接: https://www.lsjlt.com/news/181508.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • django源码分析 LazySetti
    一、django中通过LazySetting对象来获取项目的配置,LazySetting对象有什么特性?为什么使用这个对象? LazySetting顾名思义,就是延迟获取配置内容。比如,我们定义了一个对象A,并对其添加了一些属性,对A初始...
    99+
    2023-01-31
    源码 django LazySetti
  • django源码分析 python ma
    django是一个快速开发web应用的框架, 笔者也在django框架上开发不少web应用,闲来无事,就想探究一下django底层到底是如何实现的,本文记录了笔者对django源码的分析过程 I believe to become a ...
    99+
    2023-01-31
    源码 django ma
  • 源码分析Django的message组件
    目录Django的Message组件(源码分析)1. 配置2. 设置值3. 读取值4. 源码分析4.1第一步: 设置值4.2 第二步: 读取值Django的Message组件(源码分...
    99+
    2023-05-18
    Django message组件 Django message
  • Django admin源码剖析
    单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。 比如,某个服务器程序的配置信息存放在...
    99+
    2023-01-30
    源码 Django admin
  • python django事务transaction源码分析详解
    python Django事务 网上关于django1.6的事务资料很多,但是1.8的却搜不到任何资料,自己要用的时候费了不少劲就是不行,现在记下要用的人少走弯路 version:Django 1.8 事务...
    99+
    2022-06-04
    详解 源码 事务
  • fastapi与django异步的并发源码对比分析
    这篇文章主要介绍“fastapi与django异步的并发源码对比分析”,在日常操作中,相信很多人在fastapi与django异步的并发源码对比分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”fastapi...
    99+
    2023-07-05
  • RateLimiter 源码分析
    俗话说得好,缓存,限流和降级是系统的三把利剑。刚好项目中每天早上导出数据时因调订单接口频率过高,订单系统担心会对用户侧的使用造成影响,让我们对调用限速一下,所以就正好用上了。 常用的限流算法有2种:漏桶算法和令牌桶算法。漏桶算法漏...
    99+
    2023-05-31
    ratelimiter 源码 mi
  • SocketServer 源码分析
    Creating network servers. contents SocketServer.py contents file head BaseServer BaseServer.serve_forever BaseServ...
    99+
    2023-01-31
    源码 SocketServer
  • CesiumJS源码分析
    这篇文章主要介绍“CesiumJS源码分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“CesiumJS源码分析”文章能帮助大家解决问题。1. 有什么光CesiumJS 支持的光的类型比较少,默认场...
    99+
    2023-07-06
  • 【Django】REST_Framework框架——APIView类源码解析
    一、APIView类源码解析 1、APIView是REST framework提供的所有视图的基类,继承自Django的View父类。 2、APIView与 View的不同之处在于: 1、传入到...
    99+
    2023-09-14
    django python 后端
  • python django事务实例源码解析
    这篇文章主要讲解了“python django事务实例源码解析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“python django事务实例源码解析”吧!python Django事务#&...
    99+
    2023-06-19
  • Python Django源码运行过程解析
    目录一、Django运行顺序1.启动1.1 命令行启动(测试服务器)2.监听2.1 runserver(测试服务器)3.中间件的执行本文只算是本人片面之言(当然也会借鉴网络上公开资料...
    99+
    2022-11-11
  • Django drf请求模块源码解析
    DRF 框架,全称为 Django Rest Framework,是 Django 内置模块的扩展,用于创建标准化 RESTful API;它利用 ORM 映射数据库,并自定义序列化...
    99+
    2022-11-12
  • Django的admin源码浅析和模仿
    admin模块: admin提供了5种接口 list_display, 指定数据展示字段,不能放多对多字段 list_display_link,哪个字段可以链接   search_fields,搜索框 search_fiekds ...
    99+
    2023-01-31
    源码 Django admin
  • Android LayoutInflater.inflate源码分析
    LayoutInflater.inflate源码详解 LayoutInflater的inflate方法相信大家都不陌生,在Fragment的onCreateView中或者在Ba...
    99+
    2022-06-06
    layoutinflater Android
  • Android AsyncTask源码分析
    Android中只能在主线程中进行UI操作,如果是其它子线程,需要借助异步消息处理机制Handler。除此之外,还有个非常方便的AsyncTask类,这个类内部封装了Handl...
    99+
    2022-06-06
    asynctask Android
  • Nebula Graph源码分析
    本篇内容介绍了“Nebula Graph源码分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!导读对于一些...
    99+
    2022-10-19
  • Kafka源码分析(一)
    Apache Kafka® 是 一个分布式流处理平台. 这到底意味着什么呢 我们知道流处理平台有以下三种特性: 可以让你发布和订阅流式的记录。这一方面与消息队列或者企业消息系统类似。 可以储存流式的记录,并且有较好的容错性。 可...
    99+
    2019-10-17
    Kafka源码分析(一)
  • Pythonkeras.metrics源代码分析
    目录前言metrics原理解析(以metrics.Mean为例)创建自定义metrics创建无状态 metrics通过继承Metric创建有状态metricsadd_metric()...
    99+
    2022-11-13
    Python keras.metrics Python keras.metrics方法 Python keras.metrics示例
  • 分析Android Choreographer源码
    目录一、前言二、主线程运行机制的本质三、Choreographer 简介3.1、Choreographer 的工作流程四、Choreographer 源码分析4.1、Choreogr...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作