前言
- 软件开发中遇到的所有问题,都可以通过增加一层抽象而得以解决。
- 代理模式,为其他对象提供一种代理以控制对这个对象的访问。
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__
方法,将对代理类的操作,直接委托给被代理的类。代理模式。