Skip to content

值得您信賴的旅遊品牌 | 團體旅遊、自由行的專家‎

機場接送

Menu
  • 首頁
  • 旅遊天地
  • 裝潢設計
  • 環保清潔
  • 發燒車訊
Menu

Python面試常用的高級用法,怎麼動態創建類?

Posted on 2021-03-192021-03-19 by admin

本文始發於個人公眾號:TechFlow,原創不易,求個關注

今天是Python專題的第16篇文章,今天我們來聊聊Python當中的元類。

元類是Python當中的高級用法,如果你之前從來沒見過這個術語或者是沒聽說過這個概念,這是非常正常的,因為一方面它的使用頻率不高,另外一方面就是它相對不太容易理解。以至於很多Python開發者都理解得不是很深入,導致了市面上相關的資料也並不太多。我也是讀了一些大牛的代碼才開啟了這扇新世界的大門。

一切都是對象

我們之前的時候曾經介紹過,在Python當中一切都是對象,注意,是一切都是對象。我們都知道對象是類實例化之後的結果,可以簡單地將類和對象類比成模具和成品的關係。模具是類,而根據模具做出來的產品是對象。

這個比喻思想比較接近,但是不完美。因為實際當中一個模具可以做出多個產品,一個產品只有一個模具。但編程語言當中不同,由於類之間可以繼承以及多繼承,也就是說一個對象可以對應多個類。所以這個比喻不是特別合適,但是類和對象的關係是沒錯的。

但是這就有了一個問題,既然Python當中一切都是對象,那麼是不是說類其實也是一個對象呢?也就是說一個模具其實也是另外一個模具的產品?同樣,這個模具的模具其實也是另外一個模具的產品,那麼我們一直追問下去會怎麼樣呢?

很簡單,我們做個實驗就知道了,我們可以用_class__關鍵字來查看一個變量的類型,那麼我們反覆調用就可以查看其中的關係了:

從上面的圖中我們可以發現,num是int類型的變量。我們繼續查看int這個類型的類型,得到了type類型。而當我們去查看type的類型的時候,會發現我們得到的還是一個type的類型。

所以我們可以明白了,type是Python中用來創建所有類的元類,是所有模具的模具。在Python當中,我們把一個類的類叫做元類(metaclass)。所以type就是Python當中內置的元類,我們也可以自己創建我們需要的元類。通過元類,我們創建的對象也是一個類,而不是一個實例。

動態創建類

理解了type是一切類基礎之後,再來看動態類就簡單了。動態類是動態語言最大的特性之一,作為典型的動態語言,Python自然也是支持類型的動態創建的。

在Python當中,創建動態類型的一種方式就是通過type關鍵字。說起來有些意想不到,type函數不是用來查詢對象所屬的類型的嗎,怎麼還可以創建類呢?

這其實是type的另外一種用法,作為元類來創建一個類。在這種用法,type函數接收3個參數,分別是類型的名稱,父類的元組,以及一個字典。除了第一個參數之外,後面兩個參數都可以為空。比如我們來看一個例子:

注意,type返回的結果是一個類,而不是一個實例。所以我們還可以通過它創建實例:

hello = Hello()

這樣創建出來的是最簡單的空類,它什麼也沒有,和下面的代碼等價。

class Hello:
    pass

我們也可以在type的參數當中為這個類填充屬性和方法:

def hello_world(self):
    print('hello')
    
Hello = type('Hello', (), {'hello':hello_world, 'num': 3})

這樣我們就為Hello這個類創建了一個方法叫做hello,一個屬性num等於3。我們可以來調用一下試試:

也就是說我們可以使用type來根據我們的需要自行定義類,只不過type既可以獲取對象的類型又可以創建新的類,看起來可能覺得有些不太直觀,但是其實這也是說得通的。我們在Python當中通過調用str創建一個string對象,通過int來創建一個integer對象,那麼通過type則是創建一個類的對象。

實現繼承

我們之前說了,當我們使用type來創建類的時候,還可以傳入父類的元組從而實現類的繼承。

比如我們再創建一個叫做World的類繼承剛才通過type創建出來的Hello類,然後在為它加上額外的函數:

def say_world(self):
    print('World')
    
World = type('World', (Hello, ), {'world': say_world})

注意這裏傳入第二個參數是父類的元組,既然是元組,那麼當元素只有一個的時候,需要加上逗號,表示這是一個元組。這樣創建出來的類和我們通過class定義的靜態類效果是一樣的:

也就是說,我們可以先把函數實現,然後再根據任務的需要把這些函數組裝成新的類。顯然,這和傳統的C++以及Java這些靜態類型的語言相比,要靈活得多。

總結

我們固然可以通過type來創建動態創建類,但是從上面的使用過程也應該看得出來,這樣使用起來並不太方便,並且很多進階的功能很難實現。舉個簡單的例子,比如我們想要動態地為一個已有的類添加一些動態的方法,生成新的類。我們使用type就很難實現。type也的確不是Python元類的主要運用,metaclass才是王道,但由於篇幅限制,這部分將放在下一篇文章當中。

當然,元類是一個非常高級的用法,以至於Python的創始人說99%的Python程序員並不需要用到它。所以如果你覺得理解起來非常費勁的話也沒有關係,知道這麼個概念就可以了。

今天的內容就是這些,如果喜歡本文,可以的話,請點個關注,給我一點鼓勵,也方便獲取更多文章。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※想知道最厲害的網頁設計公司"嚨底家"!

※別再煩惱如何寫文案,掌握八大原則!

※產品缺大量曝光嗎?你需要的是一流包裝設計!

※回頭車貨運收費標準

※台中搬家公司費用怎麼算?

好站推薦

  • 健康醫療 減重知識專區
  • 婚紗世界 婚紗攝影寫真網
  • 成人話題 未滿18請勿進入
  • 流行時尚 時下流行愛美情報
  • 理財資訊 當舖借貸信用卡各式理財方法
  • 生活情報 各行各業情報資訊
  • 科技資訊 工業電子3C產品
  • 網路資訊 新奇趣味爆笑內容
  • 美食分享 全台各式名產 伴手禮
  • 裝潢設計 買屋賣屋裝修一羅框
  • 視覺設計 T恤、團體服、制服、polo衫

近期文章

  • 疑似小米手環 6 規格與新功能現身!加入血氧飽和偵測、GPS、更多運動模式_網頁設計公司
  • Microsoft 365 還是 Google Workspace?一文看懂企業生產力工具選哪套_如何寫文案
  • Sony Mobile 全新 Xperia Compact 小尺寸手機回歸?爆料大神釋出高清晰渲染圖_網頁設計公司
  • 微軟最新的廣告,直白地跟你說 Surface Pro 7 就是比 MacBook Pro 好_網頁設計
  • MagSafe 會干擾心律調節器?蘋果支援頁面有正式解答了_貨運

標籤

USB CONNECTOR  南投搬家公司費用 古典家具推薦 台中室內設計 台中室內設計師 台中搬家 台中搬家公司 台中電動車 台北網頁設計 台東伴手禮 台東名產 地板施工 大圖輸出 如何寫文案 婚禮錄影 宜蘭民宿 家具工廠推薦 家具訂製工廠推薦 家具訂製推薦 實木地板 床墊 復刻家具推薦 新竹婚宴會館 木地板 木質地板 柚木地板 桃園機場接送 桃園自助婚紗 沙發修理 沙發換皮 海島型木地板 潭子電動車 牛軋糖 租車 網站設計 網頁設計 網頁設計公司 貨運 超耐磨木地板 銷售文案 隱形鐵窗 電動車 馬賽克拼貼 馬賽克磁磚 馬賽克磚

彙整

  • 2021 年 4 月
  • 2021 年 3 月
  • 2021 年 2 月
  • 2021 年 1 月
  • 2020 年 12 月
  • 2020 年 11 月
  • 2020 年 10 月
  • 2020 年 9 月
  • 2020 年 8 月
  • 2020 年 7 月
  • 2020 年 6 月
  • 2020 年 5 月
  • 2020 年 4 月
  • 2020 年 3 月
  • 2020 年 2 月
  • 2020 年 1 月
  • 2019 年 12 月
  • 2019 年 11 月
  • 2019 年 10 月
  • 2019 年 9 月
  • 2019 年 8 月
  • 2019 年 7 月
  • 2019 年 6 月
  • 2019 年 5 月
  • 2019 年 4 月
  • 2019 年 3 月
  • 2019 年 2 月
  • 2019 年 1 月
  • 2018 年 12 月
©2021 值得您信賴的旅遊品牌 | 團體旅遊、自由行的專家‎ | Built using WordPress and Responsive Blogily theme by Superb