眾所周知:
type()函數可以查看變量的類型:
先看一個簡單的列子來看一下type查看變量類型
class Animal():
pass
a=Animal()
print(type(a))
print(type(Animal))
<class '__main__.Animal'>
<class 'type'>
可以發現我定義的Animal類本身的類型是 type
從 Python 解釋器的角度來看,當程序使用 class 定義 Animal 類時,也可理解為定義了一個特殊的對象(type 類的對象),並將該對象賦值給 Animal 變量。因此,程序使用 class 定義的所有類都是 type 類的實例。
實際上 Python 完全允許使用 type() 函數(相當於 type 類的構造器函數)來創建 type 對象,又由於 type 類的實例就是類,因此 Python 可以使用 type() 函數來動態創建類
正常情況下類的創建及實例化調用
class Test():
name = "Test"
def hello(self):
print("hello world")
t = Test()
t.hello()#Test.hello(t)
print(t.name)
而使用type()動態創建類:
def hello(self):
self.name = 10
print("hello world")
t = type("hello",(),{"a":1,"hello":hello})
print(t)
T = t()
print(T.a)
T.hello()
print(T.name)
<class '__main__.hello'>
1
hello world
10
所以type是可以實現動態創建類的,其實python中一切都是對象,類也是對象;只不過是一種特殊的對象,是type的對象
python中類創建的本質:
我們使用class創建類,當你使用class關鍵字時,Python解釋器自動創建這個對象。而底層其實使用的是type函數(type函數也可以查看實例所屬類型)來創建類的。所以我們可以直接使用type()函數來手動實現動態創建類。
當type()只有一個參數時,其作用就是返回變量或對象的類型
當type()有三個參數時,其作用就是創建類對象:
第一個參數:name表示類名稱,字符串類型
第二個參數:bases表示繼承對象(父類),元組類型,單元素使用逗號
第三個參數:attr表示屬性,這里可以填寫類屬性、類方式、靜態方法,采用字典格式,key為屬性名,value為屬性值
總結:
通過type添加的屬性是類屬性,並不是實例屬性
通過type可以給類添加普通方法,靜態方法,類方法,效果跟class一樣
type創建類的效果,包括繼承等的使用性質和class創建的類一樣。本質class創建類的本質就是用type創建。所以可以說python中所有類都是type創建的。
對元類的理解與注意事項
元類就是類的類,python中函數type實際上是一個元類。type就是Python在背后用來創建所有類的元類。Python中所有的東西——都是對象。這包括整數、字符串、函數以及類。它們全部都是對象,而且它們都是從一個類創建而來,這個類就是type。type就是Python的內建元類,當然了,也可以創建自己的元類
。
python查看對象所屬類型既可以用type函數,也可以用對象自帶的__class__屬性。
以下代碼驗證:任何對象最終的所屬類都是type。 type是所有類的創造者。
num = 1
print(num.__class__)
print(num.__class__.__class__)
<class 'int'>
<class 'type'>