Python中type()詳解 動態建立類

2021-09-24 13:41:27 字數 1975 閱讀 8378

眾所周知:

type()函式可以檢視變數的型別:

先看乙個簡單的列子來看一下type檢視變數型別

class animal():

pass

a=animal()

print(type(a))

print(type(animal))

可以發現我定義的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",(),)

print(t)

t = t()

print(t.a)

t.hello()

print(t.name)

1hello 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__)

Python中type()詳解 動態建立類

眾所周知 type 函式可以檢視變數的型別 先看乙個簡單的列子來看一下type檢視變數型別 class animal pass a animal print type a print type animal class main animal class type 可以發現我定義的animal類本身...

詳解Python中的type 方法的使用

nbs程式設計客棧p type 方法返回傳遞變數的型別。如果傳遞變數是字典那麼它將返回乙個字典型別。語法以下是type 方法的語法 type dict 引數返回值 此方法返回傳遞變數的型別。例子下面的例子顯示type 方法的使用 us程式設計客棧r bin python dict 程式設計客棧 pr...

python中type和isinstance的使用

a1 1,2 print type a1 class a 建立乙個空類 pass 代表空行,讓編譯器不報錯 a a 建立乙個物件 print type a class b a 建立乙個類b,繼承自類a pass 空行,沒有實際意義,僅僅讓編譯器不報錯 b b 建立乙個類b的物件 print type...