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