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