1. 程式人生 > >換個角度理解python元編程

換個角度理解python元編程

應該 鴨子類型 字符 就是 yacc 玩具 方法 進入 一個

元編程這個概念本身不新,只是沒有發現原來很早就在用這個東西,所以python等下再聊,先理一理怎麽理解編程這個事情。
我仔細思考,其實是在做一件設計想法,紀錄想法,實現想法的過程。
怎麽樣設計想法?應該需要一些圖形,文字通過一定格式紀錄下來,反復修改,最好是有一個規範或者工具讓其他人也能明白和理解,方便交流。這個問題在編程這裏也就是進入到編程語言的選擇上面來,也可以自己制定一個規範,不管你用lex+yacc語法制導還是設計LLVM的AST,反正結果是要一種編程語言來設計你的想法。
選定了設計想法的規範也就是編程語言,現在就是怎麽樣來紀錄想法,顯而易見不可能是流水賬式的紀錄,你得把想法重點理清楚,想法的關鍵字是什麽,有些什麽用途,有沒有關聯的事務,這裏就是紀錄想法的格式,對應到編程就是你用什麽設計模式,你是用傳統的類繼承,還是鴨子類型的接口或者猴子補丁的方式來紀錄想法。
有了紀錄的想法圖紙,對應到編程就是靜態的代碼字面量,就能真正的實現想法,根據想法圖紙生成真實的對象。
這個過程和元編程有什麽關系?如果你明白上面的過程,我就可以這樣描述:lex+yacc可以創建編程語言,編程語言可以創建元編程,元編程可以創建類,類可以創建對象實例。
那到底什麽是元編程呢,C++裏面他的實現叫做模板和宏,python裏面他可以用裝飾器實現,也可以用type元類型實現,他是在編程語言和類之間的一層設計技術,yacc生成的對象是編程語言,編程語言生成的對象是元編程對象,元編程對象生成的對象是類,類生成的對象是實例。
C的宏和模板出現得很早很早,本質也很簡單,就像是一份留白的合同,你填上名字就能用。
python對象有2個重要的容器,一個是繼承元組,一個是屬性字典,所有的屬性包括方法都是放在屬性字典裏面,這個2個容器在init之前就已經生成好,如果你要在init之前做一些處理,比如捕獲子類的屬性名把字符串類型的屬性名前面都加上str,把方法名首字符都大寫,強制子類使用一些編程規約,還或者加載一些緩存的數據,實現方法重載等等。當然子類可以在init做自己的處理,如果你是一個框架的設計者,自動化一些背後的處理確實看起來很高級。所以元編程的本質就是一種增加樂趣的玩具,應為編碼很枯燥的。

換個角度理解python元編程