python 延迟加载

作者: Alcazar | 来源:发表于2019-06-20 11:23 被阅读29次
延迟加载的目的:

节省一些初始化所需要的时间和空间
Python里面的延迟加载用得非常多,其主要思想是延迟所要引入类的实例化。来达成上述的目的(节省一些初始化所需要的时间和空间)

基本思路

我们创建一个类,我们将我们需要实例化的类传给他,这时该类都会变成一个延迟加载类,在应用的时候,虽然我实例化了这个延迟加载类,但是我们要引用的类就没有实例化。


参考文档:https://blog.csdn.net/hbnn111/article/details/80858889
思想路线:我们对于一个实例化的操作,无非最终会归结为__getattr____setattr__等运算符,因此只要我们定义好这些运算符就可以实现这些延迟,即只有执行这些操作的时候,才去真正实例化我们想要实例化的类:

class Foo:
    x=1
    def __init__(self,y):
        self.y=y

    def __getattr__(self, item):
        print('----> from getattr:你找的属性不存在')

    def __setattr__(self, key, value):
        print('----> from setattr')
        # self.key=value #这就无限递归了,你好好想想
        self.__dict__[key]=value #应该使用它

    def __delattr__(self, item):
        print('----> from delattr')
        del self.item #无限递归了
        self.__dict__.pop(item)

    def __getattribute__(self, item):
        print('----> __getattribute__')
        return super().__getattribute__(item)

f = Foo(1)
print("---分割线--")
f.z = 10

执行__setattr__操作的时候,才去真正实例化我们想要实例化的类,在延迟函数__delattr__(self, item)中,没有实例化要引入的类,下面来分析一下内存的占用情况

内存分析

output:

----> from setattr
----> __getattribute__
---分割线--
----> from setattr
----> __getattribute__

Example:

class Cache:
    _cache = dict()

    def __setattr__(self, key, value):
        if not Cache._cache.keys().__contains__(key):
            Cache._cache[key] = []

        Cache._cache[key].append(value)

    def __getattribute__(self, item):

        if not Cache._cache.keys().__contains__(item):
            return None

        return Cache._cache[item]

c = Cache()
c.user = "Zurich"
c.user = "MMMM"
print(c.user)

output: ['Zurich', 'MMMM']

我感觉自己都不是很懂这个..... 迷得很...

相关文章

  • python 延迟加载

    延迟加载的目的: 节省一些初始化所需要的时间和空间Python里面的延迟加载用得非常多,其主要思想是延迟所要引入类...

  • 懒加载和预加载

    1)概念: 懒加载也叫延迟加载:JS图片延迟加载,延迟加载图片或符合某些条件时才加载某些图片。预加载:提前加载图片...

  • JS

    JS 懒加载,预加载 概念:懒加载也叫延迟加载:JS图片延迟加载,延迟加载图片或符合某些条件时才加载某些图片。预加...

  • 图片懒加载

    懒加载与预加载的基本概念。 懒加载也叫延迟加载:JS图片延迟加载 延迟加载图片或符合某些条件时才加载某些图片。 预...

  • mybatis 延迟加载

    mybatis 延迟加载 什么是延迟加载 延迟加载又叫懒加载,也叫按需加载,也就是说先加载主信息,需要的时候,再去...

  • 单例模式

    延迟加载 延迟加载是指等到真正使用时去创建实例,不使用时不创建实例 对比延迟加载(懒汉式)和非延迟加载(饿汉式):...

  • js延迟加载的六种方式

    js实现延迟加载的几种方法,js的延迟加载有助与提高页面的加载速度 JS延迟加载,也就是等页面加载完成之后再加载 ...

  • 深入理解js

    延迟加载 (Lazyload) 三种实现方式 延迟加载也称为惰性加载,即在长网页中延迟加载图像。用户滚动到它们之前...

  • js 实现图片懒加载

    一、懒加载 懒加载也叫延迟加载,Js中图片的延迟加载,延迟图片需要符合某些条件时才加载;对于图片过多的页面,为了加...

  • javascript图片懒加载与预加载的分析

    懒加载与预加载的基本概念。 懒加载也叫延迟加载:前一篇文章有介绍:JS图片延迟加载 延迟加载图片或符合某些条件时才...

网友评论

    本文标题:python 延迟加载

    本文链接:https://www.haomeiwen.com/subject/fkkdqctx.html