Python自學成才之路 什麼是元類

2021-10-08 03:48:14 字數 1442 閱讀 5380

有這麼乙個類

classa(

object):

pass

a = a(

)print

(type

(a))

輸出:<

class

'__main__.a'

>

類a的例項a型別是,如果把type用在類a上會輸出什麼?

print

(type

(a))

輸出:<

class

'type'

>

輸出結果,這個type到底是什麼型別,在來看看下面兩個案例。

s =

"ads"

print

(type

(s))

print

(type

(str))

x =100

print

(type

(x))

print

(type

(int))

輸出:<

class

'str'

>

<

class

'type'

>

<

class

'int'

>

<

class

'type'

>

str和int使用type輸出都是,這個type很神奇,為何python基本資料型別使用type()返回的是type型別,type()用來類上面返回的也是type型別,難道是這些都沒有型別了所有type()沒有結果返回就返回了。不是的,其實這個type叫做元類。

python中一切都是物件,包括基本的資料型別,函式等都是物件。其實類也是物件,這裡很繞,類本身是用來建立物件的,既然類本身也是乙個物件,那類這個物件誰類例項化的?是由元類來例項化的。所以上面建立a這個物件例項時過程實際上是:

type建立a這個類例項,a這個類例項建立a這個物件例項。

要說元類有哪些,頂級元類只有type,但是通過繼承type能夠實現自定義元類。比如下面這個案例:

class

metaclass

(type):

pass

class

demo

(metaclass=metaclass)

:pass

可以通過metaclass引數來指定元類,如果沒有指定,預設都是使用type這個元類。

元類涉及到python建立物件的生命週期,理解了元類你會對python有乙個更深刻的認識,知其然,更要知其所以然。很多優秀的框架都用到了元類程式設計,比如flask,sqlalchemy等,如果你要閱讀這些框架的原始碼,元類程式設計是需要懂的。如果你想自己做一些開源框架,那必須要熟練使用元類程式設計。

python自學成才之路 檔案讀寫操作

python對檔案io操作有兩種格式,第一種是如下形式 filepath iotest.txt try f open filepath,r print f.read finally if f f.close 第二種是如下形式 filepath iotest.txt with open filepat...

Python自學成才之路 帶有引數的裝飾器

上一節留了點懸念。上一節 函式和裝飾器都可以新增引數,但是裝飾器結構上的區別在於裝飾器是否帶引數。看下面乙個案例 class my decorate object def init self,f 如果裝飾器不帶引數,函式需要作為引數傳遞給這個類的構造器 print 進入到 init self.f f...

自學成才 總結

前言 這次應該是第五次參加自考了吧,我只想說,自考完之後,乙個字,累。這次總共參加了3科,計算機網路 馬克思,資訊資源管理。1.計算機網路 一直跟著小組的腳步,試卷沒有想象的那麼難,只希望過了吧。2.馬克思主義基本原理概論 oh my god 馬克思貌似是在高中時候學過的吧,已經記不太清了,只知道馬...