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