type()函式:動態建立類
阿新 • • 發佈:2020-08-14
我們知道,type() 函式屬於Python內建函式,通常用來檢視某個變數的具體型別。其實,type() 函式還有一個更高階的用法,即建立一個自定義型別(也就是建立一個類)。
type() 函式的語法格式有 2 種,分別如下:
type(obj)
type(name, bases, dict)
以上這 2 種語法格式,各引數的含義及功能分別是:
- 第一種語法格式用來檢視某個變數(類物件)的具體型別,obj 表示某個變數或者類物件。
- 第二種語法格式用來建立類,其中 name 表示類的名稱;bases 表示一個元組,其中儲存的是該類的父類;dict 表示一個字典,用於表示類內定義的屬性或者方法。
對於使用 type() 函式檢視某個變數或類物件的型別,由於很簡單,這裡不再做過多解釋,直接給出一個樣例:
#檢視 3.4 的型別 print(type(3.4)) #檢視類物件的型別 class CLanguage: pass clangs = CLanguage() print(type(clangs))
輸出結果為:
<class 'float'>
<class '__main__.CLanguage'>
這裡重點介紹 type() 函式的另一種用法,即建立一個新類,先來分析一個樣例:
#定義一個例項方法 def say(self): print("我要學 Python!") #使用 type() 函式建立類 CLanguage = type("CLanguage",(object,),dict(say = say, name = "C語言中文網")) #建立一個 CLanguage 例項物件 clangs = CLanguage() #呼叫 say() 方法和 name 屬性 clangs.say() print(clangs.name)
注意,Python 元組語法規定,當 (object,) 元組中只有一個元素時,最後的逗號(,)不能省略。
可以看到,此程式中通過 type() 建立了類,其類名為 CLanguage,繼承自 objects 類,且該類中還包含一個 say() 方法和一個 name 屬性。
有讀者可能會問,如何判斷 dict 字典中新增的是方法還是屬性?很簡單,如果該鍵值對中,值為普通變數(如 "C語言中文網"),則表示為類添加了一個類屬性;反之,如果值為外部定義的函式(如 say() ),則表示為類添加了一個例項方法。
執行上面的程式,其輸出結果為:
我要學 Python!
C語言中文網
可以看到,使用 type() 函式建立的類,和直接使用 class 定義的類並無差別。事實上,我們在使用 class 定義類時,Python 直譯器底層依然是用 type() 來建立這個類。