懒加载

懒加载

当调用某个属性或方法时,相关的资源(如对象实例等)不会立即加载,而是在需要的时候才进行加载,这种策略可以显著减少内存消耗。

django-admin来举例

urls.py

urlpatterns = [
    path('admin/', admin.site.urls),   
]

相关知识点

class Person(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __getattr__(self, item):
       return "__getattr__"

obj = Person("xx", "123")
print(obj.email)  #当获取不到email的时候,会自动调用__getattr__方法

底层代码

def new_method_proxy(func):
    def inner(self, *args):
        if (_wrapped := self._wrapped) is empty:
            self._setup()
            _wrapped = self._wrapped
        # 通过getattr去获取相应的内容
        return func(_wrapped, *args)

    return inner


class LazyObject:
     _wrapped = None
        
     __getattr__ = new_method_proxy(getattr)
    

class DefaultAdminSite(LazyObject):
    def _setup(self):
        AdminSiteClass = import_string(apps.get_app_config("admin").default_site)
        # 需要的时候才进行加载
        self._wrapped = AdminSiteClass()

    def __repr__(self):
        return repr(self._wrapped)


site = DefaultAdminSite()

当我们自己要使用的时候

class Person(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def do_something(self):
        return "do_something"
    
    
class DefaultAdminSite(LazyObject):
    def _setup(self):
        self._wrapped = Person("xx", 123)

# obj相当于一个代理
obj = DefaultAdminSite() 
# 这里才会真正的去实例化对象,然后调用do_something方法
print(obj.do_something())   
posted @ 2024-10-20 10:55  清风拂山岗(小高同学)  阅读(6)  评论(0编辑  收藏  举报