Python編程思想(29):使用type()函數定義類

李寧老師已經在「極客起源」 微信公衆號推出《Python編程思想》電子書,囊括了Python的核心技術,以及Python的主要函數庫的使用方法。讀者可以在「極客起源」 公衆號中輸入 160442 開始學習。

《Python編程思想》總目錄
《Python編程思想》專欄

在Python語言中使用 type函數可以查看變量的數據類型,但如果想使用 type直接查看某個類的類型型呢?先看如下程序:

示例代碼:type_demo. py

class MyClass:
    pass
my = MyClass()
# 查看變量my的類型
print(type(my)) # <class '__main__.MyClass'>
# 查看MyClass類本身的類型
print(type(MyClass)) # <class 'type'>

運行這段代碼,會在Console中輸出如下內容:

<class '__main__.MyClass'>
<class 'type'>

從上面的輸出結果可以看到,MyClass類本身的類型是type。那麼怎樣理解MyClass類的類型是type呢?

從 Python解釋器的角度來看,當程序使用 class定義MyClass類時,也可理解爲定義了一個特殊的對象(type類的對象),並將該對象賦值給MyClass變量。因此,程序使用 class定義的所有類都是type類的實例。

實際上 Python完全允許使用 type函數(相當於type類的構造器函數)來創建type對象,又由於type類的實例就是類,因此,Python可以使用 type函數來動態創建類,代碼如下:

示例代碼: type_ class. py

def run(self):
    print('run函數')
# 使用type()定義Person類
Person = type('Person', (object,), dict(run=run, age=12))
# 創建Person對象
p = Person()
# 分別查看p和Person的類型
print(type(p))
print(type(Person))
p.run()
print(Person.age)

在這段代碼中使用type函數定義了一個Person類。在使用type()函數定義類時可指定如下3個參數:

參數1:創建的類名;

參數2:該類繼承的父類集合。由於 Python支持多繼承,因此該參數使用元組指定它的多個父類。即使實際只有一個父類,也需要使用元組指定父類(必須要多一個逗號,否則會拋出下面的異常);

TypeError: type.__new__() argument 2 must be tuple, not type

參數3:該參數是一個字典類型的值,表示該類綁定的類變量和方法。其中字典的key就是類變量或方法,如果字典的 value是普通值,那就代表類變量;如果字典的 value是函數,則代表方法;

由此可見,這段代碼中定義的Person類的父類是object類,還爲該類定義了一個run()方法和一個age類變量。運行這段代碼,會輸出如下的結果:

<class '__main__.Person'>
<class 'type'>
run函數
12

從上面的輸出結果可以看出,使用 type()函數定義的類與直接使用 class定義的類並沒有任何區別。事實上, Python解釋器在執行使用 class定義的類時,其實依然是使用 type函數來創建類的。因此,無論通過哪種方式定義類,程序最終都是創建一個type的實例。

-----------------支持作者請轉發本文,也可以加李寧老師微信:unitymarvel,或掃描下面二維碼加微信--------
在這裏插入圖片描述

歡迎關注 極客起源 微信公衆號,更多精彩視頻和文章等着你哦!
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章