在大多數(shù)編程語(yǔ)言中,類就是一組用來(lái)描述如何生成一個(gè)對(duì)象的代碼段。在Python中這一點(diǎn)仍然成立:在Python的世界里,一切皆為對(duì)象:數(shù)值、序列、字典、函數(shù)、模塊、、類、等等,無(wú)一例外。其中,“類也是對(duì)象” 的概念最讓人匪夷所思,這完全超越了傳統(tǒng)的OO(object oriented)思想。
但是,Python中的類還遠(yuǎn)不止如此。類同樣也是一種對(duì)象。是的,沒(méi)錯(cuò),就是對(duì)象。只要你使用關(guān)鍵字class,Python解釋器在執(zhí)行的時(shí)候就會(huì)創(chuàng)建一個(gè)對(duì)象。
class User(object):
pass
user = User()
print(user)
將在內(nèi)存中創(chuàng)建一個(gè)對(duì)象,名字就是 User。這個(gè)對(duì)象(類對(duì)象User)擁有創(chuàng)建對(duì)象(實(shí)例對(duì)象)的能力。但是,它的本質(zhì)仍然是一個(gè)對(duì)象,于是乎你可以對(duì)它做如下的操作:
1.你可以將它賦值給一個(gè)變量
2.你可以拷貝它
3.你可以為它增加屬性
4.你可以將它作為函數(shù)參數(shù)進(jìn)行傳遞
class User(object):
def say(self):
print("hello word")
Python解釋器執(zhí)行class語(yǔ)句時(shí):
確定元類mcls。元類的查找優(yōu)先級(jí)為:
首先查找類User是否擁有屬性__metaclass__
否則查找類User的父類是否具有屬性__metaclass__
否則查找類User所在模塊是否具有全局變量__metaclass__
否則使用默認(rèn)元類(經(jīng)典類:types.ClassType;新式類:type)
python中新式類與舊式類的區(qū)別:
新式類和經(jīng)典類的最大不同之處在于,所有的新式類必須至少一個(gè)父類,參數(shù)bases可以是一個(gè)或者多個(gè)用于繼承的父類。
新式類都從object繼承,經(jīng)典類不需要。
新式類的MRO(method resolution order基類搜索順序)算法采用C3算法廣度優(yōu)先搜索,而舊式類的MRO算法是采用深度優(yōu)先搜索
新式類相同父類只執(zhí)行一次構(gòu)造函數(shù),經(jīng)典類重復(fù)執(zhí)行多次。