- 深入理解Django:框架內幕與實現原理
- 沈聰 全樹強編著
- 553字
- 2022-05-06 12:24:04
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文件中的配置信息了。至此,前文提出的兩個問題就迎刃而解了。
- 高效微控制器C語言編程
- Arduino by Example
- 樂學Web編程:網站制作不神秘
- Java FX應用開發教程
- Mastering Ubuntu Server
- Highcharts Cookbook
- C++20高級編程
- SciPy Recipes
- 編程可以很簡單
- OpenCV Android Programming By Example
- Oracle Data Guard 11gR2 Administration Beginner's Guide
- Java RESTful Web Service實戰
- 小學生C++趣味編程從入門到精通
- JavaScript Mobile Application Development
- Improving your Penetration Testing Skills