編譯裝飾器
① 【angular】NgMole學習
NgMole參考手冊
在模板中可用的選擇器 selector 包括那些直接聲明在這里的可聲明對象和導入的那些 NgMole 中所導出的可聲明對象。
可聲明對象必須屬於也 只能屬於一個模塊 。 如果你嘗試把同一個類聲明在多個模塊中,那麼編譯器就會報錯。 要注意 不能聲明那些從其它模塊中導入的類 。
Angular 使用 entryComponents 來啟用 樹震動 , 即 只編譯 項目中 實際使用 的組件 ,而不是編譯所有在 ngMole 中聲明但從未使用的組件
這是用 ViewContainerRef.createComponent( ) 添加的動態添加的組件。將它們添加到 entryComponents 告訴離線模板編譯器編譯它們並為它們創建工廠。
Angular 會自動將以下類型的組件添加到模塊的 entryComponents 中:
① @ NgMole.bootstrap 列表中的組件,如動態載入 AppComponent 。
② 路由器配置中引用的組件,因為 router-outlet 也使用 ViewContainerRef.createComponent( ) 將路由組件添加到 DOM 。。
離線模板編譯器 OTC 只生成實際使用的組件。如果組件不直接用於模板, OTC 不知道是否需要編譯。有了 entryComponents ,你可以告訴 OTC 也編譯這些組件,以便在運行時可用。 如一個列表頁中點擊新增按鈕時,彈出的表單組件,它不在路由中,需要顯示寫在 entryComponents 中 。
導出具有傳遞性。 MoleA 可以導入 MoleB 並將其導出,這會讓所有 MoleB 中的導出同樣可用在導入了 MoleA 的那些模塊中。
angular 中的 NgMole 是否類似 java 中的 package 呢?
通過導出的傳遞性,將第三方組件模塊引入到具體的頁面模塊
Angular 系統中通過在類上添加 @Injectable 裝飾器來告訴系統這個類(服務)是可注入的。當然了這僅僅只是告訴 Angular 系統這個類(服務)類是可注入的。但是這個服務可以在哪裡使用,由誰提供,就得靠注入器和提供商來一起確定了。
(一) providedIn 方式:對應三個值: Type<any> 、 root 、 null
編譯的時候會拋出一個警告信息,編譯不過。具體怎麼寫,也請看原文吧。
(二) Component (組件)級注入器
本人自己看的 angular工程案例 中,使用 第二種方式 的居多(即裝飾器 @Component 中的 providers 比較常見; @NgMole中 的 providers 就在 app.mole 中見過 );
關於 provider的詳細介紹 也請參看原文,本人還未深入學習,後期有機會深入使用的話,再認真看看。暫時先會簡單的使用!!!
@NgMole 了解一點嘍,後面再看看其他裝飾器: Angular裝飾器介紹
② 2021年的前端框架選擇 Angular vs React vs Vue
每個前端開發人員都聽說過三個用於構建 Web 應用程序的框架:React、Vue.js和Angular。
React 是一個 UI 庫,Angular 是一個成熟的前端框架,而 Vue.js 是一個漸進式框架。
它們幾乎可以互換使用來構建前端應用程序,但它們並非 100% 相同,因此比較它們並了解它們的差異是有意義的。
每個框架都是基於組件的,並允許快速創建 UI 功能。
然而,它們都有不同的結構和架構——所以首先,我們將研究它們的架構差異以了解它們背 後的哲學。
React 不強制執行特定的項目結構,正如您從下面的官方「Hello World」示例中看到的那樣,您只需幾行代碼即可開始使用 React。
React 可以用作 UI 庫來渲染元素,而無需強制執行特定的項目結構,這就是它不是嚴格意義上的框架的原因。
React Elements是 React 應用程序的最小構建塊。它們比 DOM 元素更強大,因為 React DOM 確保在發生變化時有效地更新它們。
組件是更大的構建塊,定義了在整個應用程序中使用的獨立且可重用的部分。它們接受稱為 props 的輸入並生成元素,然後顯示給用戶。
React 基於 JavaScript,但它主要與JSX (JavaScript XML)結合,這是一種語法擴展,允許您創建同時包含 HTML 和 JavaScript 的元素。
您使用 JSX 創建的任何內容也可以使用 React JavaScript API 創建,但大多數開發人員更喜歡 JSX,因為它更直觀。
Vue.js 核心庫只關注視圖層。之所以稱為漸進式框架,是因為您可以使用官方和第三方包(例如Vue Router或Vuex )擴展其功能,將其轉變為實際框架。
雖然 Vue 與 MVVM(Model-View-ViewModel)模式沒有嚴格關聯,但它的設計部分受到了它的啟發。使用 Vue,您將主要在 ViewModel 層上工作,以確保以允許框架呈現最新視圖的方式處理應用程序數據。
Vue 的模板語法讓您可以創建 View 組件,並將熟悉的 HTML 與特殊指令和功能相結合。這種模板語法是首選,即使原始 JavaScript 和 JSX 也受支持。
Vue 中的組件很小,是自包含的,並且可以在整個應用程序中重復使用。帶有擴展名的單文件組件(SFC).vue包含 HTML、CSS 和 JavaScript,因此所有相關代碼都位於一個文件中。
SFC 是在 Vue.js 項目中組織代碼的推薦方式,尤其是大型項目。需要使用 Webpack 或 Browserify 等工具將 SFC 轉換為可用的 JavaScript 代碼。
在本文中,我討論的是 Angular 2,而不是現在稱為 AngularJS 的框架的第一個版本。
AngularJS,原始框架,是一個MVC(模型-視圖-控制器)框架。但是在Angular 2 中,與 MV*-patterns 沒有嚴格的關聯,因為它也是基於組件的。
Angular 中的項目被組織成模塊、組件和服務。每個 Angular 應用程序至少有一個根組件和一個根模塊。
Angular 中的每個組件都包含一個模板、一個定義應用程序邏輯的類和元數據(裝飾器)。組件的元數據告訴 Angular 在哪裡可以找到創建和呈現其視圖所需的構建塊。
Angular 模板是用 HTML 編寫的,但也可以包含帶有特殊指令的Angular 模板語法,以輸出反應性數據和呈現多個元素等。
組件使用 Angular 中的服務來委託業務邏輯任務,例如獲取數據或驗證輸入。它們是 Angular 應用程序的獨特部分。雖然 Angular 不強制使用它們,但強烈建議將應用程序構建為一組可以重用的不同服務。
Angular 內置於 TypeScript 中,因此建議使用它以獲得最無縫的體驗,但也支持純 JavaScript。
React 是最受歡迎的 JavaScript 項目之一,在 GitHub 上擁有 16 萬顆星。它由 Facebook 開發和維護,並在他們的許多項目內部使用。此外,根據BuiltWith的使用統計數據,它為超過 200 萬個網站提供支持。
在三個框架中,Vue在 GitHub上的 star 數最多,有 176k。該項目由前 Google 員工 Evan You 開發和領導。據BuiltWith 稱,這是開源社區中一個非常強大的獨立項目,被超過 100 萬個網站使用。
Angular 是由 Google 開發的,但令人驚訝的是它並沒有用於他們的一些旗艦產品,例如搜索或 Youtube。它經常用於企業項目,並基於BuiltWith的數據為超過 97,000 個網站提供支持。
它是三個框架中星數最少的,在 GitHub 上有 68k 星。然而,當從 Angular 1 切換到 Angular 2 時,他們創建了一個全新的代碼庫,而不是繼續AngularJS項目,該項目也有 59k 星。
在開發應用程序時,開源包可以為您節省寶貴的時間。不僅如此,它們通常比定製組件和封裝更好,因為它們經過了實戰測試。
查看可幫助您更輕松地創建新功能的現成組件、主題和其他工具的可用性非常重要。
許多前端應用程序依賴全局狀態管理來存儲信息,例如誰登錄和其他用戶設置。
最流行的 JavaScript 狀態管理項目是Rex。大多數開發人員使用Rex的官方 React 綁定,這些綁定由 Rex 團隊維護。
由於 React 的流行,查找輸入組件和現成的元素非常容易。它們都只是在 Google 或 GitHub 上搜索即可。
React 生態系統還包括React Native,它允許您從用 React 編寫的單個代碼庫構建原生 iOS 和 Android 應用程序。因此,React 也可以成為使用 Web 技術構建移動應用程序的絕佳選擇。
React 是 MERN 堆棧的一部分,其中包含 MongoDB、ExpressJS、React 和 NodeJS。這種組合的偉大之處在於,單一語言——JavaScript——為整個應用程序提供動力。
盡管 Rex 可以在 Vue 中使用,但沒有官方綁定。但這不應該讓您擔心,因為Vuex是專門為 Vue 應用程序製作的官方狀態管理庫。除了與 Vue 很好地集成之外,使用 Vue 的開發人員工具進行調試也很容易。
在 Vue 的早期,很難找到現成的組件。隨著社區的發展,您可以使用各種輸入組件和高級元素來加快開發速度。
對於移動應用程序開發,有一個名為Weex 的新興項目。Weex 由阿里巴巴開發和使用,但不如 React Native 成熟和強大。更重要的是,由於該項目在中國開發和使用較多,因此很難找到英文文檔和解決問題的方法。
Vue 與 Laravel 集成得很好,這就是為什麼它們經常一起使用。Laravel 提供完整的JavaScript 和 CSS 腳手架,以支持在新項目中使用 Vue。
對於 Angular 中的狀態管理,您可以使用NgRx項目。它的靈感來自 Rex,但它是專門為 Angular 創建的。
與 Vue 和 React 的情況一樣,您可以將許多現成的組件導入到您的項目中。與 Angular 略有不同的是,Angular Material項目中有許多官方組件。這是 Google 的一個官方項目,為 Angular 應用程序提供 Material Design 組件。
您可以使用NativeScript在 Angular 中構建跨平台移動應用程序。它也支持 Vue,但 Angular 支持更成熟。
Angular 是著名的 MEAN 堆棧的一部分,它將 Angular 與 MongoDB、ExpressJS 和 NodeJS 相結合。與 MERN 堆棧類似,它的前端和後端都完全依賴 JavaScript。
Angular、React 和 Vue 都可用於開發漸進式 Web 應用程序,也稱為 PWA。
PWA 不是移動應用程序,而是 Web 應用程序,智能手機用戶可以將其添加為主屏幕的快捷方式,並提供類似於原生移動應用程序的外觀和感覺。
您還可以為每個框架找到高級模板和預制應用程序,但 Angular 和 React 比 Vue 提供更多高級選項。
在選擇框架或庫時,您還需要考慮性能。
在許多情況下,您不必擔心性能,尤其是在構建小型項目時。然而,項目的范圍和復雜性越大,性能就會(並且將會)成為一個問題。
重要的是要注意,在 Web 性能方面,開發質量和遵循最佳實踐比框架的選擇更重要。
但由於存在一些性能指標和差異,我將研究它們並解釋每個指標如何影響您的開發工作。
JS 框架基準測試的結果表明,它們在大多數基準測試中都表現得相當好,例如在表中創建或附加行。
正如你在上面看到的,Vue 在選擇行時比 Angular 和 React 慢得多。另一方面,Angular 和 React 在交換行方面效率不高。
這些是渲染基準中唯一的實質性差異 - 在大多數情況下,不會產生明顯的結果。由於選擇行是比交換行更常見的功能,我想說這個基準測試將 Vue 排在第三位,僅次於 Angular 和 React 並列第一。
在內存和啟動時間方面,React 和 Vue 得分很好,但 Angular 稍慢。Angular 啟動一個基本腳本可能需要 150 毫秒,並且需要更多內存才能運行。
谷歌 Chrome 實驗室的Perf Track顯示了來自數千個網站的生產數據。這些統計數據受許多其他因素的影響,而不僅僅是選擇的框架,讓我們看看數字。
與 Angular 相比,Vue 和 React 網站在這個指標上的排名更高,Angular 需要更多時間來啟動並向用戶呈現內容。
在渲染完整頁面的三個框架中,Angular 也是最慢的,只有 27% 的 Angular 網站得分在可接受的范圍內。
對於所有三個框架,超過 80% 的網站都在第一次輸入延遲的可接受范圍內,這顯示了用戶可以與頁面交互所需的時間。
迄今為止,最輕量級的應用程序是使用 Vue 開發的應用程序,68% 的 Vue 應用程序載入的 JavaScript 不到 1MB。另一方面,Angular 和 React 應用程序往往具有更大的代碼大小。
您可以從這些數字中看到趨勢,但您不應該太快得出結論。例如,對於最後一張圖,可以解釋為 Vue 用於開發更輕量級的應用程序,而 Angular 用於更大的項目。
統計數據可以幫助指導您做出正確的決定,但您不能使用它們來證明一個框架比另一個更快或更好。
對於更高級的應用程序,使用的前端框架應該能夠執行一些提高性能並且可以更好地擴展的任務。
兩項關鍵技術是伺服器端渲染 (SSR) 和虛擬化。
React 支持使用官方ReactDOMServer包進行伺服器端渲染。對於虛擬化,您可以使用名為React Virtualized的流行第三方工具。
Vue 中也支持伺服器端渲染以及官方的SSR 包。此外,您還可以使用基於 Vue 構建並支持 SSR的Nuxt.js框架。
不幸的是,Vue 中的虛擬化選項並不是那麼強大。在我看來,Vue Virtual Scroll List是虛擬滾動的最佳解決方案,但它有點問題,不如 React 和 Angular 的選項穩定。
Angular 擁有SSR的官方Angular Universal包,以及用於虛擬滾動和高效渲染大型列表的官方組件。
學習這些框架有多容易?
要回答這個問題,我們需要查看每個框架的復雜性及其引入的概念。
在最基本的用例中,React 是三個框架中最不復雜的。那是因為你只需要導入庫,然後你就可以用幾行代碼開始編寫你的 React 應用程序。
但是除了 Hello World 示例之外,大多數 React 應用程序都是基於組件的,而不僅僅是在頁面上呈現一些元素。
一些開發人員對 React 感到奇怪或困難的一件事是,學習 JSX 是一條單行道。您也可以使用原始 JavaScript,但由於大多數 React 開發人員使用 JSX,學習它幾乎是不可避免的。
這是使 React 的學習曲線變得更陡峭的主要因素,但除此之外,對於了解 JavaScript 並理解 Web 開發概念的開發人員來說,它是一個易於學習的庫。
Vue 的設置比 React 稍微復雜一些。你可以將它用作一個庫來定義你可以在整個 HTML 中使用的組件——但與 React 類似,這不是大多數項目的構建方式。
大多數 Vue 項目都有一個命名的根組件App.vue和一些用於顯示各種內容的子組件。
說到語法,你唯一需要學習的新東西就是 Vue 的模板語法,如果你了解 HTML,這很容易掌握。基本的指令,如v-if和v-for有條件的渲染和列表的渲染,很容易理解即使是初學者。
此外,Vue 的單文件組件將所有前端代碼保存在一個地方,便於組織新項目。
在我看來,Vue 是最容易學習的,因為它的簡單和直觀的語法。
Angular 擁有三者中最復雜的項目結構,而且由於它是一個成熟的前端框架,因此它依賴的概念更多。
除了組件,Angular 還支持模塊和服務。它希望您以特定的方式編寫和設計代碼庫,從而使您的項目在擴展時更易於維護。
至於語法,由於 Angular 最適合與 TypeScript 配合使用,因此在構建 Angular 項目時了解 TypeScript 非常重要。
與 Vue 一樣,您還必須熟悉類似 HTML 的語法,以便您可以開始使用 Angular 編寫新的 UI 功能。
在我看來,Angular 對於普通開發者來說是最難學的,因為它更復雜並且依賴於 TypeScript。
許多開源項目和框架逐漸被遺忘並無人維護。您是否應該擔心我們在這里討論的任何框架?
盡管我們無法完全預測會發生什麼,但正在進行的開發工作是這些項目 健康 狀況的良好指標。人氣和增長也是預測項目壽命的重要指標,所以讓我們來看看每個框架。
React v17.0已經發布,但令人驚訝的是,它沒有為開發人員提供任何新功能。
主要的變化是這個新版本可以更容易地升級 React 本身。您可以將 React 的某些部分從舊版本升級到新版本,而無需升級整個項目。
如果您的應用程序依賴於隨新版本更改或棄用的功能,您可以保留舊版本以保持此功能有效。此更新使 React 成為一個很好的長期選擇,因為它可以更輕松地與新版本保持同步。
React 的每周 npm 下載量自去年以來增長了 44% 。從絕對數量來看,它仍然是三個項目中下載量最大的。
Vue 3 已於2020 年 9 月發布,它解決了 Vue 2 在大型項目中存在的許多嚴重問題。它引入了受React Hooks啟發的Composition API,可以更輕松地跨組件重用邏輯。
整個項目用 TypeScript 重寫,提高了新 Vue 項目對 TypeScript 的支持,同時也使項目更易於維護。
Vue 3 是一個急需的升級,使 Vue 更適合大型項目。
Vue 的每周下載量自去年以來增長了 87%,使 Vue 成為相對而言增長最快的框架。如果 Vue 能夠保持這種增長速度,那麼它肯定會很快超過 Angular。
Angular 最近推出了Ivy 編譯器。它減少了構建時間,優化了資產,允許更快的測試,並總體上改善了開發人員的體驗。
Angular 團隊每年發布兩次重大更新,其中可能包含新功能,或者只是讓框架跟上新瀏覽器版本的速度。
自去年以來,Angular 的每周下載量增長了約 50% ,因此它仍然是一個受歡迎的項目。
Angular、React 和 Vue 都處於非常活躍的開發階段。他們定期發布新版本並維護現有版本。由於在每種情況下當前的支持水平都很高,因此您可以安全地使用這些框架中的任何一個。
需要注意的是,Angular 的增長沒有以前那麼快,而 Vue—— 盡管它是最近開始的——似乎增長了很多。
如前所述,我們無法預測哪些框架會長期保持相關性,但每個項目背後都有一個偉大的社區,並且在不斷發展。
我這篇文章的目標是解釋架構差異,分解每個框架的優點和缺點,並在適用的地方進行比較。
在進入一個新框架之前,有幾件事情需要考慮。
首先,在選擇新技術時,您團隊的經驗可能是一個決定性因素。
同樣,您必須考慮您所在地區可用的人才,以便您可以為您的項目聘請開發人員。
最後,當涉及到項目本身時,復雜性和范圍也會影響您對框架的選擇。
通過考慮所有關鍵差異,我希望您可以決定哪個是最適合您的目標和需求的前端框架。
(本文由聞數起舞翻譯自Aris Pattakos的文章《Angular vs React vs Vue 2021》,轉載請註明出處,原文鏈接:https://athemes.com/guides/angular-vs-react-vs-vue/)
③ 如何學習python
1、Python 介紹
學習一門新的語言之前,首先簡單了解下這門語言的背景。Python 是一種面向對象的解釋型計算機程序設計語言,由荷蘭人 Guido van Rossum 於 1989 年發明,第一個公開發行版發行於 1991 年。Python 在設計上堅持了清晰劃一的風格,這使得 Python 成為一門易讀、易維護,並且被大量用戶所歡迎的、用途廣泛的語言。Python 具有豐富和強大的庫。它常被昵稱為膠水語言,能夠把用其他語言製作的各種模塊(尤其是 C/C++)很輕松地聯結在一起。
2、Python 技術浪潮
IT行業熱門技術,更新換代非常的快,技術的浪潮一波接著一波,最初的浪潮無疑是桌面時代,使用 C# 搭建桌面應用開始嶄露頭角,MFC 還是計算機科學專業必學會的東西。接著就是以網站搭建為應用的背景,PHP,Ruby 等語言為主的。再到近幾年非常火熱的以移動開發為應用背景,Java(Android 開發)或者 OC(iOS 開發)語言為主。很明顯如今的浪潮就是以大數據和機器學習為應用背景,Python 語言為主。站在風尖浪口,豬都可以飛的起來。抓住這波技術浪潮,對於從事 IT 行業的人員來說有莫大的幫助。
3、Python 學習
學習一項新的技術,起步時最重要的是什麼?就是快速入門。學習任何一個學科的知識時,都有一個非常重要的概念:最少必要知識。當需要獲得某項技能的時候,一定要想辦法在最短的時間里弄清楚都有哪些最少必要知識,然後迅速掌握它們。
對於快速入門 python 來說最少必要知識,有以下幾點。
(1) Python 基礎語法
找一本淺顯易懂,例子比較好的教程,從頭到尾看下去。不要看很多本,專注於一本。把裡面的常式都手打一遍,搞懂為什麼。推薦去看《簡明python教程》,非常好的一本 Python 入門書籍。
(2)Python 實際項目
等你對 Python 的語法有了初步的認識,就可以去找些 Python 實際項目來練習。對於任何計算機編程語言來說,以實際項目為出發點,來學習新的技術,是非常高效的學習方式。在練習的過程中你會遇到各種各樣的問題:基礎的語法問題(關鍵字不懂的拼寫),代碼毫無邏輯,自己的思路無法用代碼表達出來等等。這時候針對出現的問題,找到對應解決辦法,比如,你可以重新查看書本上的知識(關於基礎語法問題),可以通過谷歌搜索碰到的編譯錯誤(編輯器提示的錯誤),學習模仿別人已有的代碼(寫不出代碼)等等。已實際項目來驅動學習,會讓你成長非常的快。Python 實際項目網上非常的多,大家可以自己去搜索下。合理利用網路資源,不要意味的只做伸手黨。
(3) Python 的學習規劃
當你把上面兩點做好以後,你就已經入門了 Python,接下來就是規劃好自己的以後的學習規劃。能找到一個已經會 Python 的人。問他一點學習規劃的建議,然後在遇到卡殼的地方找他指點。這樣會事半功倍。但是,要學會搜索,學會如何更好地提問,沒人會願意回答顯而易見的問題。當然如果你身邊沒有人會 Python,也可以在網上搜索相應的資料。
Python 可以做的事非常的多,比如:Python 可以做日常任務,比如自動備份你的MP3;可以做網站,很多著名的網站像知乎、YouTube 就是 Python 寫的;可以做網路游戲的後台,很多在線游戲的後台都是 Python 開發的。每個人都有自己感興趣的方向,有的對網站開發比較感興趣,有的對數據處理感興趣,有的對後台感興趣。所以你們可以根據自己感興趣的方向,網上搜索相關資料,加以深入的學習,規劃好自己未來的方向。只要堅持,你就能精通 Python,成為未來搶手的人才。
④ Python為什麼能擴展
Python 具有高可擴展性,存在許多使用 C 語言或 Fortran 編寫擴展的方法。必要時,Python 代碼可以直接將這些擴展作為子常式來調用。這部分討論用於構建擴展的一些主要編譯器(絕對不是完整列表)。
相關推薦:《Python基礎教程》
Cython
Cython(不同於 CPython)既是指一種語言,也是指一種編譯器。Cython 語言是添加了 C 語言語法的 Python 語言的超集。Cython 可以在代碼段或完整函數中顯式釋放 GIL。變數和類屬性上的 C 類型聲明以及對 C 函數的調用都使用 C 語法。其餘部分代碼則使用 Python 語法。通過這個混合的 Cython 代碼,Cython 編譯器可生成高效的 C 代碼。任何定期優化的 C/C++ 編譯器都可以編譯此 C 代碼,從而高度優化擴展的運行時代碼,性能接近於原生的 C 代碼性能。
Numba
Numba 是一個動態、即時 (JIT) 且可感知 NumPy 的 Python 編譯器。Numba 使用 LLVM 編譯器基礎架構,生成優化的機器代碼和從 Python 調用代碼的包裝器。與 Cython 不同,編碼使用常規的 Python 語言。Numba 可讀取來自裝飾器中所嵌入注釋的類型信息,並優化代碼。對於使用 NumPy 數據結構的程序,比如數組以及許多數學函數,它可以實現與 C 或 Fortran 語言類似的性能。NumPy 對線性代數和矩陣函數使用硬體加速,利用 LAPACK 和 BLAS 提供額外加速,大大提升了性能,參見 IBM 博客文章C、Julia、Python、Numba 和 Cython 在 LU 因式分解方面的速度比較。
除 CPU 以外,Numba 還能夠使用 GP-GPU 後端。Anaconda, Inc. 是 Python 某個主要發行版的幕後公司,該公司還開發了 Numba 和商業版的 Numba Pro。
Fortran to Python Interface Generator
Fortran to Python Interface Generator (F2Py) 起初為一個獨立的程序包,現在包含在 NumPy 中。F2Py 支持 Python 調用以 Fortran 編寫的數值常式,就好像它們是另一個 Python 模塊一樣。因為 Python 解釋器無法理解 Fortran 源代碼,所以 F2Py 以動態庫文件格式將 Fortran 編譯為本機代碼,這是一種共享對象,包含具有 Python 模塊介面的函數。因此,Python 可以直接將這些函數作為子常式來調用,以原生 Fortran 代碼的速度和性能來執行。
⑤ Category(類別)是怎樣的
Category(類別)是一種不需要子類化就可以讓能動態的給已經存在的類增加方法的強有力的機制。新增的方法是在編譯期增加的,這些方法執行的時候和被擴展的類的其它方法是一樣的。它可能與裝飾器設計模式的定義稍微有點不同,因為Category(類別)不會保存被擴展類的引用。
⑥ 如何在 TypeScript 中使用裝飾器
TypeScript 是 JavaScript 語言的擴展,它使用 JavaScript 的運行時和編譯時類型檢查器。
這種組合允許開發人員使用完整的 JavaScript 生態系統和語言功能,同時,還可以在其之上添加可選的靜態類型檢查、枚舉、類和介面。這些額外功能之一是裝飾器的支持。
裝飾器是一種裝飾類成員或類本身的方法,具有額外的功能。
當我們將裝飾器應用於類或類成員時,我們實際上是在調用一個函數,該函數將接收被裝飾內容的詳細信息,然後,裝飾器實現將能夠動態轉換代碼,添加額外的功能,並且 減少樣板代碼。
它們是在 TypeScript 中進行元編程的一種方式,TypeScript 是一種編程技術,使程序員能夠創建使用來自應用程序本身的其他代碼作為數據的代碼。
本教程將分享如何在 TypeScript 中為類和類成員創建自己的裝飾器,以及如何使用它們。
它將引導我們完成不同的代碼示例,我們可以在自己的 TypeScript 環境或 TypeScript Playground(一個允許我們直接在瀏覽器中編寫 TypeScript 的在線環境)中遵循這些示例。
准備工作
要完成本教程實例,我們需要做如下准備:
在 TypeScript 中啟用裝飾器支持
目前,裝飾器在 TypeScript 中仍然是一個實驗性功能,因此,必須先啟用它。在本節中,我們將了解如何在 TypeScript 中啟用裝飾器,具體取決於您使用 TypeScript 的方式。
TypeScript 編譯器 CLI
要在使用 TypeScript Compiler CLI (tsc) 時啟用裝飾器支持,唯一需要的額外步驟是傳遞一個附加標志 --experimentalDecorators:
tsconfig.json
在具有 tsconfig.json 文件的項目中工作時,要啟用實驗性裝飾器,我們必須將實驗性裝飾器屬性添加到 compilerOptions 對象:
在 TypeScript Playground 中,裝飾器默認啟用。
使用裝飾器語法
在本節中,我們將在 TypeScript 類中應用裝飾器。
在 TypeScript 中,我們可以使用特殊語法 @expression 創建裝飾器,其中 expression 是一個函數,將在運行時自動調用,其中包含有關裝飾器目標的詳細信息。
裝飾器的目標取決於我們添加它們的位置。 目前,裝飾器可以添加到類的以下組件中:
例如,假設我們有一個名為 seal 的裝飾器,它在類中調用 Object.seal。 要使用我們的裝飾器,我們可以編寫以下內容:
這同樣適用於所有其他類型的裝飾器:
要添加多個裝飾器,請將它們一個接一個地添加在一起:
在 TypeScript 中創建類裝飾器
在本節中,我們將完成在 TypeScript 中創建類裝飾器的步驟。
對於名為 @decoratorA 的裝飾器,我們告訴 TypeScript 它應該調用函數 decoratorA。 將調用 decoratorA 函數,其中包含有關如何在代碼中使用裝飾器的詳細信息。
要創建自己的裝飾器,我們必須創建一個與裝飾器同名的函數。 也就是說,要創建您在上一節中看到的密封類裝飾器,您必須創建一個接收一組特定參數的密封函數。 讓我們這樣做:
傳遞給裝飾器的參數將取決於裝飾器的使用位置。第一個參數通常稱為目標。
然後,在密封函數中,在目標(即類構造函數)以及它們的原型上調用 Object.seal。當這樣做時,不能將新屬性添加到類構造函數或其屬性中,並且現有屬性將被標記為不可配置。
重要的是要記住,目前在使用裝飾器時無法擴展目標的 TypeScript 類型。這意味著,例如,你無法使用裝飾器將新欄位添加到類並使其成為類型安全的。
如果在密封類裝飾器中返回了一個值,該值將成為該類的新構造函數。如果想完全覆蓋類構造函數,這很有用。
已經創建了第一個裝飾器,並將它與一個類一起使用。
接下來,我們將學習如何創建裝飾器工廠。
創建裝飾器工廠
有時,我們需要在應用裝飾器時將其他選項傳遞給裝飾器,為此,我們必須使用裝飾器工廠。
在這里,我們將學習如何創建和使用這些工廠。
裝飾器工廠是返回另一個函數的函數。他們收到這個名字是因為他們不是裝飾器實現本身。
相反,它們返回另一個負責實現裝飾器的函數並充當包裝函數。通過允許客戶端代碼在使用裝飾器時將選項傳遞給裝飾器,它們在使裝飾器可定製方面很有用。
假設,有一個名為 decoratorA 的類裝飾器,並且,我們想添加一個可以在調用裝飾器時設置的選項,例如,布爾標志,可以通過編寫類似於以下的裝飾器工廠來實現此目的:
在這里,decoratorA 函數返回另一個帶有裝飾器實現的函數。 注意,裝飾器工廠如何接收一個布爾標志作為它的唯一參數:
我們可以在使用裝飾器時傳遞此參數的值。
請參閱以下示例中突出顯示的代碼:
在這里,當我們使用 decoratorA 裝飾器時,將調用裝飾器工廠,並將 someBooleanFlag 參數設置為 true。
然後,裝飾器實現本身將運行。 這允許我們根據使用方式更改裝飾器的行為,從而,使我們的裝飾器易於自定義和通過應用程序重用。
請注意,我們需要傳遞裝飾器工廠預期的所有參數。 如果,我們只是應用裝飾器而不傳遞任何參數,如下例所示:
TypeScript 編譯器會給你兩個錯誤,這可能會因裝飾器的類型而異。 對於類裝飾器,錯誤是 1238 和 1240:
我們剛剛創建了一個能夠接收參數並根據這些參數更改其行為的裝飾器工廠。
在下一步中,我們將學習如何創建屬性裝飾器。
創建屬性裝飾器
類屬性是另一個可以使用裝飾器的地方,在這里,我們將了解如何創建它們。
任何屬性裝飾器都接收以下參數:
目前,沒有辦法獲取屬性描述符作為參數。 這是由於 TypeScript 中屬性裝飾器的初始化方式。
這是一個裝飾器函數,它將成員的名稱列印到控制台:
當我們運行上面的 TypeScript 代碼時,你會在控制台中看到如下列印:
我們可以使用屬性裝飾器來覆蓋被裝飾的屬性。這可以通過Object.defineProperty與屬性的新 setter 和 getter 一起使用來完成。
讓我們看看如何創建一個名為 的裝飾器allowlist,它只允許將屬性設置為靜態允許列表中存在的值:
首先,我們要在代碼頂部創建一個靜態許可名單:
然後,我們創建一個屬性裝飾器:
請注意,我們如何使用 any 作為目標的類型:
對於屬性裝飾器來說,目標參數的類型可以是類的構造函數,也可以是類的原型,在這種情況下使用any比較容易。
在裝飾器實現的第一行中,我們將被裝飾的屬性的當前值存儲到 currentValue 變數中:
對於靜態屬性,這將設置為其默認值(如果有)。
對於非靜態屬性,這將始終未定義。 這是因為在運行時,在編譯的 JavaScript 代碼中,裝飾器在實例屬性設置為其默認值之前運行。
然後,我們將使用 Object.defineProperty 覆蓋該屬性:
Object.defineProperty 調用有一個 getter 和一個 setter。 getter 返回存儲在 currentValue 變數中的值。
如果 currentVariable 在允許列表中,setter 會將其值設置為 newValue。
讓我們使用您剛剛編寫的裝飾器。 創建以下 Person 類:
我們現在將創建類的新實例,並測試設置並獲取name實例屬性:
運行代碼,我們應該看到以下輸出:
該值永遠不會設置為 Peter,因為 Peter 不在允許列表中。
如果我們想讓代碼更具可重用性,允許在應用裝飾器時設置允許列表,該怎麼辦? 這是裝飾器工廠的一個很好的用例。
讓我們通過 allowlistOnly 裝飾器變成裝飾器工廠來做到這一點。
在這里,我們將之前的實現包裝到另一個函數中,即裝飾器工廠。 裝飾器工廠接收一個名為允許列表的參數,它是一個字元串數組。
現在,要使用的裝飾器,我們必須通過許可名單,如以下突出顯示的代碼所示:
嘗試運行與之前編寫的代碼類似的代碼,但有新的更改:
輸出如下:
顯示它按預期工作,person.name 永遠不會設置為 Peter,因為 Peter 不在給定的白名單中。
現在,我們已經使用普通裝飾器函數和裝飾器工廠創建了第一個屬性裝飾器,是時候看看如何為類訪問器創建裝飾器了。
創建訪問器裝飾器
在這里,我們將了解裝飾類訪問器。
就像屬性裝飾器一樣,訪問器中使用的裝飾器接收以下參數:
但與屬性裝飾器不同的是,它還接收第三個參數,即訪問器成員的屬性描述符。
鑒於 Property Descriptors 包含特定成員的 setter 和 getter,訪問器裝飾器只能應用於單個成員的 setter 或 getter,而不能同時應用於兩者。
如果我們從訪問器裝飾器返回一個值,該值將成為 getter 和 setter 成員的訪問器的新屬性描述符。
下面是一個可用於更改 getter/setter 訪問器的可枚舉標志的裝飾器示例:
請注意示例中,我們是如何使用裝飾器工廠的。 這允許我們在調用裝飾器時指定可枚舉標志。
以下是如何使用裝飾器:
訪問器裝飾器類似於屬性裝飾器。 唯一的區別是它們接收帶有屬性描述符的第三個參數。 現在,我們已經創建了第一個訪問器裝飾器。
接下來,我們將學習如何創建方法裝飾器。
創建方法裝飾器
在這里,我們將學習如何使用方法裝飾器。
方法裝飾器的實現與創建訪問器裝飾器的方式非常相似。 傳遞給裝飾器實現的參數與傳遞給訪問器裝飾器的參數相同。
讓我們重用之前創建的同一個可枚舉裝飾器,但這次是在以下 Person 類的 getFullName 方法中:
如果我們從方法裝飾器返回一個值,該值將成為該方法的新屬性描述符。
讓我們創建一個deprecated的裝飾器,它在使用該方法時將傳遞的消息列印到控制台,記錄一條消息說該方法已被棄用:
在這里,我們正在使用裝飾器工廠創建裝飾器。 這個裝飾器工廠接收一個字元串類型的參數,這是棄用的原因,如下面突出顯示的部分所示:
deprecationReason 將在稍後將棄用消息記錄到控制台時使用。在不推薦使用裝飾器的實現中,我們正在返回一個值。當我們從方法裝飾器返回值時,該值將覆蓋該成員的屬性描述符。
我們正在利用這一點為裝飾類方法添加一個吸氣劑。這樣,我們就可以更改方法本身的實現。
但是為什麼不直接使用 Object.defineProperty 而不是為方法返回一個新的屬性裝飾器呢?這是必要的,因為,我們需要訪問 this 的值,對於非靜態類方法,它綁定到類實例。
如果,我們直接使用 Object.defineProperty ,將無法檢索 this 的值,並且如果該方法以任何方式使用 this ,則當從裝飾器實現中運行包裝的方法時,裝飾器會破壞我們的代碼。
在這樣情況下,getter 本身的 this 值綁定到非靜態方法的類實例,並綁定到靜態方法的類構造函數。
然後,在你的 getter 中創建一個本地包裝函數,稱為 wrapperFn,此函數使用 console.warn 將消息記錄到控制台,傳遞從裝飾器工廠收到的 deprecationReason,然後使用 propertyDescriptor.value 調用原始方法。
apply(this, args),以這種方式調用原始方法,並將其 this 值正確綁定到類實例,以防它是非靜態方法。
然後,我們將使用 defineProperty 覆蓋類中方法的值。這就像一種記憶機制,因為對同一方法的多次調用將不再調用 getter,而是直接調用 wrapperFn。
我們現在正在使用 Object.defineProperty 將類中的成員設置為將wrapperFn 作為其值。
讓我們使用已棄用的裝飾器:
在這里,我們創建了一個具有兩個屬性的 TestClass:一個是靜態的,一個是非靜態的。 我們還創建了兩種方法:一種是靜態的,一種是非靜態的。
然後,我們將已棄用的裝飾器應用於這兩種方法。 運行代碼時,控制台中會出現以下內容:
這表明這兩種方法都使用了包裝函數正確包裝,該函數將一條消息記錄到控制台並說明棄用原因。
你現在已經使用 TypeScript 創建了你的第一個方法裝飾器。
接下來,我們將學習如何創建 TypeScript 支持的最後一個裝飾器類型,即參數裝飾器。
創建參數裝飾器
參數裝飾器可以用在類方法的參數中。
在這里,我們將學習如何創建一個與參數一起使用的裝飾器函數,
接收以下參數:
方法參數列表中參數的索引。
無法更改與參數本身相關的任何內容,因此,此類裝飾器僅對觀察參數使用本身有用(除非您使用更高級的東西,例如反射元數據)。
這是一個裝飾器的示例,它列印被裝飾的參數的索引以及方法名稱:
然後,你可以像這樣使用你的參數裝飾器:
運行上述代碼應在控制台中顯示以下內容:
我們現在已經創建並執行了一個參數裝飾器,並列印出返回裝飾參數索引的結果。
總結
在本教程中,我們已經實現了 TypeScript 支持的所有裝飾器,將它們與類一起使用,並了解了它們之間的區別。
現在可以開始編寫自己的裝飾器來減少代碼庫中的樣板代碼,或者更加自信地使用帶有庫(例如 Mobx)的裝飾器。
以上就是我跟你分享的全部內容,如果你覺得有用,請記得分享給你身邊的朋友,也許能夠幫助到他。
⑦ Python課程內容都學習什麼啊
賀聖軍Python輕松入門到項目實戰(經典完整版)(超清視頻)網路網盤
鏈接: https://pan..com/s/1C9k1o65FuQKNe68L3xEx3w
若資源有問題歡迎追問~
⑧ 推薦 8 個炫酷的 Python 裝飾器
文章:Python數據分析實例
00
前言
Python 編程語言的一大優點是它把所有功能都打包到一個小包中,這些功能非常有用。
許多特性可以完全改變 Python 代碼的功能,這使得該語言更加靈活。如果使用得當,其中一些功能可以有效縮短編寫程序所需的時間。
實現這些目標的一個很好的例子是 Python 的裝飾器。
00 裝飾器
裝飾器(decorators)是一個可以用於改變一個 Python 函數對象行為的函數。它們可以應用於類和函數,可以做很多非常有趣的事情!
裝飾器可以用來縮短代碼、加速代碼並徹底改變代碼在 Python 中的行為方式。
不用說,這當然可以派上用場!今天我想炫耀一些我認為值得一試的裝飾器。
有很多裝飾器,但我選擇了一些我認為具有最酷功能的裝飾器。
01 @lru_cache
此列表中的第一個裝飾器來自 functools 模塊。
該模塊包含在標准庫中,非常易於使用。它還包含比這個裝飾器更酷的功能,但這個裝飾器肯定是我最喜歡的。
此裝飾器可用於使用緩存加速函數的連續運行。當然,這應該在使用時記住一些關於緩存的注意事項,但在通用使用情況下,大多數時候這個裝飾器是值得使用的。
能夠用一個簡單的裝飾器來加速代碼是非常棒的。
可以從這樣的裝飾器中受益的函數的一個很好的例子是遞歸函數,例如計算階乘的函數:
遞歸在計算時間上可能非常困難,但添加此裝飾器有助於顯著加快此函數的連續運行速度。
現在每當我們運行這個函數時,前幾個階乘計算將被保存到緩存中。
因此,下次我們調用該函數時,我們只需要計算我們之前使用的階乘之後的階乘。
當然,並不是所有的階乘計算都會被保存,但是很容易理解為什麼這個裝飾器的一個很好的應用程序來加速一些自然很慢的代碼。
02 @jit
JIT 是即時編譯(Just In Time)的縮寫。通常每當我們在 Python 中運行一些代碼時,發生的第一件事就是編譯。
這種編譯會產生一些開銷,因為類型被分配了內存,並存儲為未分配但已命名的別名。使用即時編譯,我們在執行時才進行編譯。
在很多方面,我們可以將其視為類似於並行計算的東西,其中 Python 解釋器同時處理兩件事以節省一些時間。
Numba JIT 編譯器因將這一概念提供到 Python 中而聞名。與@lru_cache 類似,可以非常輕松地調用此裝飾器,並立即提高代碼的性能。Numba 包提供了 jit 裝飾器,它使運行更密集的軟體變得更加容易,而不必進入 C。
以下案例使用@jit 裝飾器加速蒙特卡洛方法計算。
03 @do_twice
do_twice 裝飾器的功能與它的名字差不多。此裝飾器可用於通過一次調用運行兩次函數。這當然有一些用途,我發現它對調試特別有用。
它可以用於測量兩個不同迭代的性能。以 Functools 為例,我們可以讓一個函數運行兩次,以檢查是否有改進。該函數由 Python 中的裝飾器模塊提供,該模塊位於標准庫中。
04 @count_calls
count_calls 裝飾器可用於提供有關函數在軟體中使用多少次的信息。
像 do_twice 一樣,這當然可以在調試時派上用場。
當添加到給定的函數時,我們將收到一個輸出,告訴我們該函數每次運行時已經運行了多少次。這個裝飾器也在標准庫的裝飾器模塊中。
05 @dataclass
為了節省編寫類的時間,我一直使用的最好的裝飾器之一是@dataclass 裝飾器。
這個裝飾器可用於快速編寫類中常見的標准方法,這些方法通常會在我們編寫的類中找到。
這個裝飾器來自 dataclass 模塊。這個模塊也在標准庫中,所以不需要 PIP 來嘗試這個例子!
這段代碼將自動創建一個初始化函數 init,其中包含填充類中數據所需的位置參數。
它們也將自動提供給 self,因此無需編寫一個很長的函數來將一些數據參數放入類中。
06 @singleton
為了理解單例裝飾器的用途,我們首先需要了解單例(singleton)是什麼。從某種意義上說,單例是全局變數類型的一個版本。
這意味著類型被定義為只存在一次。盡管這些在 C++ 等語言中很常見,但在 Python 中卻很少見到。使用單例,我們可以創建一個只使用一次的類並改變類,而不是通過初始化來構造新的類型。
通常,單例裝飾器是由用戶自己編寫的,實際上並不是導入的。
這是因為單例仍然是對我們單例裝飾器中提供的模板的引用。我們可以命名一個單例函數並編寫一個包裝器,以便在我們的類上使用這個裝飾器:
另一種方法是使用元類!
07 @use_unit
在科學計算中經常派上用場的一種裝飾器是 @use_unit 裝飾器。
此裝飾器可用於更改返回結果的表示單位。這對於那些不想在數據中添加度量單位但仍希望人們知道這些單位是什麼的人很有用。
這個裝飾器也不是在任何模塊中真正可用,但它是非常常見的,對科學應用程序非常有用。
08 @singledispatch
Functools 憑借非常有用的@singledispatch 裝飾器再次在此列表中脫穎而出。
單調度是一種編程技術,在許多編程語言中都很常見,因為它是一種非常棒的編程方式。雖然我更喜歡多調度,但我認為單調度可以在很多方面扮演相同的角色。
這個裝飾器使得在 Python 中使用多類型數據變得更加容易, 尤其當我們希望通過同一方法傳遞多種類型數據時,情況更是如此。
⑨ TypeScript基礎入門之裝飾器(三)
繼續上篇文章[ TypeScript基礎入門之裝飾器(二) ]
Accessor Decorator在訪問器聲明之前聲明。 訪問器裝飾器應用於訪問器的屬性描述符,可用於觀察,修改或替換訪問者的定義。 訪問器裝飾器不能在聲明文件中使用,也不能在任何其他環境上下文中使用(例如在聲明類中)。
訪問器裝飾器的表達式將在運行時作為函數調用,具有以下三個參數:
如果訪問器裝飾器返回一個值,它將用作該成員的屬性描述符。
以下是應用於Point類成員的訪問器裝飾器( @configurable )的示例:
我們可以使用以下函數聲明定義@configurable裝飾器:
Property Decorator在屬性聲明之前聲明。 屬性修飾器不能在聲明文件中使用,也不能在任何其他環境上下文中使用(例如在聲明類中)。
屬性裝飾器的表達式將在運行時作為函數調用,具有以下兩個參數:
我們可以使用此信息來記錄有關屬性的元數據,如以下示例所示:
然後我們可以使用以下函數聲明定義@format裝飾器和getFormat函數:
這里的 @format ("Hello,%s")裝飾器是一個裝飾工廠。 當調用 @format ("Hello,%s")時,它會使用reflect-metadata庫中的Reflect.metadata函數為該屬性添加元數據條目。 調用getFormat時,它會讀取格式的元數據值。
注意此示例需要reflect-metadata庫。 有關reflect-metadata庫的更多信息,請參閱元數據。
參數裝飾器在參數聲明之前聲明。 參數裝飾器應用於類構造函數或方法聲明的函數。 參數裝飾器不能用於聲明文件,重載或任何其他環境上下文(例如聲明類中)。
參數裝飾器的表達式將在運行時作為函數調用,具有以下三個參數:
將忽略參數裝飾器的返回值。
以下是應用於Greeter類成員參數的參數裝飾器( @required )的示例:
然後我們可以使用以下函數聲明定義@required和@validate裝飾器:
@required裝飾器添加一個元數據條目,根據需要標記參數。 然後,@validate裝飾器將現有的greet方法包裝在一個函數中,該函數在調用原始方法之前驗證參數。
一些示例使用reflect-metadata庫,它為實驗元數據API添加了polyfill。 該庫尚未成為ECMAScript(JavaScript)標準的一部分。 但是,一旦裝飾器被正式採用為ECMAScript標準的一部分,這些擴展將被提議採用。
您可以通過npm安裝此庫:
TypeScript包含實驗支持,用於為具有裝飾器的聲明發出某些類型的元數據。 要啟用此實驗性支持,必須在命令行或tsconfig.json中設置emitDecoratorMetadata編譯器選
命令行:
tsconfig.json:
啟用後,只要導入了reflect-metadata庫,就會在運行時公開其他設計時類型信息。
我們可以在以下示例中看到這一點:
TypeScript編譯器將使用@ Reflect.metadata裝飾器注入設計時類型信息。 你可以認為它相當於以下TypeScript:
⑩ vue-property-decorator的簡單介紹,一看就會
參考: https://github.com/kaorun343/vue-property-decorator
怎麼使vue支持ts寫法呢,我們需要用到 vue-property-decorator, 這個組件完全依賴於 vue-class-component .
首先安裝: npm i -D vue-property-decorator
@Component 裝飾器可以接收一個對象作為參數,可以在對象中聲明 components ,filters,directives 等未提供裝飾器的選項,也可以聲明 computed,watch 等
registerHooks: 除了上面介紹的將beforeRouteLeave放在Component中之外,還可以全局注冊,就是registerHooks
2.@Prop(options: (PropOptions | Constructor[] | Constructor) = {})
@Prop 裝飾器接收一個參數,這個參數可以有三種寫法:
注意:屬性的ts類型後面需要加上 undefined 類型;或者在屬性名後面加上!,表示 非null 和 非undefined
的斷言,否則編譯器會給出錯誤提示;
@PropSync 裝飾器與 @prop 用法類似,二者的區別在於:
注意,使用PropSync的時候是要在父組件配合.sync使用的
@Model 裝飾器允許我們在一個組件上自定義 v-model ,接收兩個參數:
注意,有看不懂的,可以去看下vue官網文檔, https://cn.vuejs.org/v2/api/#model
@Watch 裝飾器接收兩個參數:
發生在 beforeCreate 勾子之後, created 勾子之前
@Ref 裝飾器接收一個可選參數,用來指向元素或子組件的引用信息。如果沒有提供這個參數,會使用裝飾器後面的屬性名充當參數
@Provide(key?: string | symbol) / @Inject(options?: { from?: InjectKey, default?: any } | InjectKey)` decorator
提供/注入裝飾器,
key可以為string或者 symbol類型,
相同點:Provide/ProvideReactive提供的數據,在內部組件使用Inject/InjectReactive都可取到 不同點:
如果提供( ProvideReactive )的值被父組件修改,則子組件可以使用 InjectReactive 捕獲此修改。
demo地址: https://github.com/slailcp/vue-cli3/tree/master/src/pc-project/views/manage