前言
- 软件开发中遇到的所有问题,都可以通过增加一层抽象而得以解决。
- 代理模式,为其他对象提供一种代理以控制对这个对象的访问。
django中的LazyObject
django.utils.functional.py
|
|
增加一个LazyObject类封装需要延迟实例化的对象,通过改写__getattr__、__setattr__和__delattr__进行代理和按需实例化。(代理模式ProxyPattern)。
django中的SimpleLazyObject
如LazyObject中所说,当只是简单的代理而不需要改变封装的_wrapped时,只需使用SimpleLazyObject。 这个代理类需要一个func参数,当需要实例化时调用。这个func参数可以是被封装的类、延迟求值的函数等,任何需要代理的对象。为了实际使用需要处理一些特殊方法,基本的实现框架如下:
|
|
真实的代理类
- 重写
_setup,被封装的类为self._wrapped = Setting(settings_module) - 通过提供
configure接口,可以由用户修改内部被封装的配置类·
django.conf.settings(django.conf.init.py)
|
|
总结
1.通过增加一个代理类,封装了延迟求值(实例化)的对象。通过增加一个层解决问题。
2.再通过改写__setattr__、__getattr__和__delattr__方法,将对代理类的操作,直接委托给被代理的类。代理模式。