一、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] = valreturn val

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

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

三、总结

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

转载于:https://www.cnblogs.com/time-read/p/10580378.html

django源码分析 LazySetting对象相关推荐

  1. Django源码分析7:migrate命令的浅析

    django源码分析 本文环境python3.5.2,django1.10.x系列 django源码分析-migrate命令分析 Django项目中提供了,通过migrations操作数据库的结构的命 ...

  2. Django源码分析6:auth认证及登陆保持

    django源码分析 本文环境python3.5.2,django1.10.x系列 1.这次分析django框架中登陆认证与接口权限检查. 2.在后端开发中,难免会对接口进行权限验证,其中对于接口是否 ...

  3. Django源码分析5:session会话中间件分析

    django源码分析 本文环境python3.5.2,django1.10.x系列 1.这次分析django框架中的会话中间件. 2.会话保持是目前框架都支持的一个功能,因为http是无状态协议,无法 ...

  4. Django源码分析4:staticfiles静态文件处理中间件分析

    django源码分析 本文环境python3.5.2,django1.10.x系列1.在上一篇文章中已经分析过handler的处理过程,其中load_middleware就是将配置的中间件进行初始化, ...

  5. Django源码分析3:处理请求wsgi分析与视图View

    django源码分析 本文环境python3.5.2,django1.10.x系列 根据前上一篇runserver的博文,已经分析了本地调试服务器的大致流程,现在我们来分析一下当runserver运行 ...

  6. Django源码分析10:makemigrations命令概述

    django源码分析 本文环境python3.5.2,django1.10.x系列 django源码分析-makemigrations命令概述 Django项目中的数据库管理命令就是通过makemig ...

  7. Django源码分析9:model.py表结构的初始化概述

    django源码分析 本文环境python3.5.2,django1.10.x系列 django源码分析-model概述 Django项目中提供了内置的orm框架,只需要在models.py文件中添加 ...

  8. Django源码分析8:单元测试test命令浅析

    django源码分析 本文环境python3.5.2,django1.10.x系列 django源码分析-test命令分析 Django项目中提供了,test命令行命令来执行django的单元测试,该 ...

  9. Django源码分析2:本地运行runserver分析

    django源码分析 本文环境python3.5.2,django1.10.x系列1.根据上一篇文章分析了,django-admin startproject与startapp的分析流程后,根据dja ...

最新文章

  1. mysql myisam innodb 区别
  2. 基于比特币现金的Token逐梦而来
  3. python 内网镜像站_Python|还是回归海龟与裸IDLE,准备卸载Anaconda
  4. python类中init_Python类中的__init__() 和 self 的解析
  5. 大众点评订单系统分库分表实践
  6. scrapy 模拟登陆
  7. “反应快”的程序猿更优秀吗?
  8. 报表性能优化方案之多数据集实现层式报表
  9. MTK中断控制器简单记录
  10. Eclipse中经常出现的问题解决方案
  11. Win7系统经常蓝屏故障处理过程及思路
  12. mingw-w64-i686-toolchain
  13. java 没有例外网站_java – Spring安全配置@Order不是唯一的例外
  14. 数据库课设:简易图书管理系统
  15. 大数据与人工智能方向基础课程简单介绍
  16. java定义个字符串_Java定义字符串(2种方式)
  17. Linux条件变量(pthread_cond)示例
  18. PhpStorm 正则 小写变大写
  19. 揭开程序员身上的「专业面纱」:非科班程序员,都来自哪些专业?
  20. 完美解决前端无法上传大文件方法

热门文章

  1. 比较MongoDB在公有云上的性能:AWS、Azure和Digital Ocean
  2. Win7旗舰版系统右键菜单响应速度很慢会延迟一段时间
  3. LinkedIn工程经理眼中的数据世界格局
  4. 怎样获得listview的第一个item?
  5. 企业架构在中国的本地化发展
  6. fwm环境APP菜品数据加载失败的优化操作
  7. 理解mipi协议【转】
  8. JS数字金额转为大写金额
  9. 《Java虚拟机原理图解》5. JVM类加载器机制与类加载过程
  10. cocos2d笔记——解析HelloWorldScene