Python超高級語法 #元類 #ORM

一、元類

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章