1. 程式人生 > 實用技巧 >type()函式:動態建立類

type()函式:動態建立類

我們知道,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() 來建立這個類。