一、元類
1. python:一切皆對象
- 類是一個對象
- 類似print()和input()等函數,爲什麼可以直接使用?因爲python解釋器運行起來後默認加載了個模塊,這個模塊被稱爲內建模塊(或 內嵌模塊) 。
- globals():(得到當前所有的全局變量。它是一個字典,鍵是變量名,值是它的引用對象)
- print(num)實際上是這樣一個過程。要把num的引用傳入print函數內部,先在globals的這個字典裏遍歷鍵,直到找到一個鍵爲num的,然後找到其值。那麼問題來了,字典中並沒有print,是怎麼找到print指向的函數的呢?
- 上面的字典中有一個鍵In,來記錄所有輸入的值。還有一個鍵Out,來記錄所有輸出的值。(ipython獨有)
- 如果在ipython中輸入的需要保存,怎麼辦? 方法1,把In裏面的值複製。方法2,ipython背後有一個sqlite數據庫,用sql語句查找出來。
- 內建函數裏有什麼:
- 當在globals中找不到時,它就會拿着
__builtin__
鍵,去其引用所對應的變量字典裏找(就是 global_dict["__builtin__"].__dict__ 這個字典)
2. 元類創建類
- 元類是一種特殊的類,用來創建類
- 元類是python中的造物主(上帝)
- 怎麼創建地創建一個實例對象? 方法1,用class。方法2,用元類(就像上面拐着彎用print函數一樣的思想)。方法3,如下:
- 上面的方法太low了,有一個方法可以動態地創建類:type 。(由於向後兼容的歷史遺留問題,type函數有兩個功能,它最原始的功能就是動態創建類)
- type(類名, 父類元組,內部字典)
- 用help函數查看,可以發現type不是一個函數,而是一個類。這個類就叫做元類 。
- 用class定義類,其實是默認調用type。
3. 元類是一切的創建者
- 元類是深度的魔法。
- 如果想搞清楚是否需要用到元類==>那麼一定用不到
- 用到元類的人都清楚他們需要做什麼,並且不需要解釋爲什麼使用元類。
4. 使用元類
- 運行上述代碼一定出錯。(並沒有Num,只有num)原因是執行到class時,自動調用了type,把屬性寫入了。
- 解決方法: 不調用type來創建,調用自己寫的東西來創建就好了。metaclass這個參數可以幫助我們。(它的缺省值爲type)
- 這不是調用了函數來創建嘛?那怎麼能稱之爲元類?
- 比如私有屬性的改名,就是通過元類。
二、ORM
1. ORM是什麼
- python中用到元類的場景少之又少。功能上相當於類的裝飾器。
- ORM是Django框架的核心思想。即 對象-關係映射
- 類名–>表名;類屬性–>每一個字段
操作類就是操作一張表
insert into 表名 (key1, key2, key3) values (1,2,3);
# >>>>>>>>>>相當於:>>>>>>>>>>
u = 表名(key1=1, key2=2, key3=3)
u.save
2. ORM實現
name = “key”
value = 7
self.name = value==>只會創建一個self.name=7
setattr(self, name, value)==>會創建 “key” = 7