官术网_书友最值得收藏!

3.1.2 LazySettings類

LazySettings類的定義如下:

上面的代碼非常有意思,它展示了一種懶加載的代碼模式。Settings類在實例化時會設置很多屬性及屬性值,LazySettings類則是在第一次訪問該對象的某個屬性時才去設置相應的屬性及屬性值。這種模式是如何做到的呢?實際上,在調用LazySettings類的某個屬性時,會進入類的魔法函數__setattr__()中。該魔法函數先校驗該對象的_wrapped屬性,在第一次進入該魔法函數時,_wrapped屬性值為空對象,即self._wrapped is empty語句為True,,于是調用_setup()方法。而_setup()方法會先從環境變量中讀取settings_module的值,接著根據settings_module的值實例化Settings類,并賦給LazySettings對象的_wrapped屬性。在這個賦值語句中,LazySettings類加載了settings_module和global_settings中的所有配置信息并保存在了_wrapped屬性中。接下來在獲取_wrapped屬性值時,就不會加載所有的配置了,而是直接從_wrapped屬性中獲取。以下是對該類的一些操作示例:

上面的代碼演示了LazySettings對象在第一次和后續調用屬性時_wrapped屬性值的區別。

在2.3節介紹shell命令的執行過程時曾遇到這個設置環境變量的語句,它出現在Django項目的manage.py文件中。下面是first_django項目的manage.py文件中的內容:

實際上,在manage.py文件中設置的環境變量正是用在配置變量讀取上的,即這里的LazySettings類中。在__init__.py文件中還有一條非常關鍵的語句:

有了這條語句,LazySettings類的演示操作就非常簡單了。這里將演示導入該對象并讀取first_django項目中關于數據庫的配置信息,這和后面要講的內容息息相關:

這樣即可讀取settings.py文件中的配置信息了。至此,前文提出的兩個問題就迎刃而解了。

主站蜘蛛池模板: 宁夏| 特克斯县| 上栗县| 特克斯县| 邵武市| 阿勒泰市| 北宁市| 宾川县| 肥城市| 房山区| 浦东新区| 乐昌市| 沙雅县| 吉首市| 金堂县| 石柱| 兴城市| 太仆寺旗| 临汾市| 长海县| 东光县| 四平市| 油尖旺区| 治多县| 兴仁县| 惠州市| 陆河县| 普宁市| 驻马店市| 新乐市| 镇宁| 永仁县| 宜丰县| 横山县| 常宁市| 陵川县| 墨玉县| 临澧县| 晋城| 西昌市| 大丰市|