大師兄的Python源碼學(xué)習(xí)筆記(二十二): 虛擬機(jī)中的類機(jī)制(一)

大師兄的Python源碼學(xué)習(xí)筆記(二十一): 虛擬機(jī)中的函數(shù)機(jī)制(三)
大師兄的Python源碼學(xué)習(xí)筆記(二十三): 虛擬機(jī)中的類機(jī)制(二)

一、Python中的對象模型

  • 在面向?qū)ο罄碚撝?,有兩個(gè)核心概念:對象,Python中也實(shí)現(xiàn)了這兩個(gè)概念。
  • 在Python中,所有東西都是對象,也是一種對象。
  • 在Python2.2之前,實(shí)際存在三類對象:
類型 說明
type對象 表示Python內(nèi)置的類型
class對象 表示Python程序員定義的類型
instance對象 表示由class對象創(chuàng)建的實(shí)例
  • 在Python2.2之后,type對象class對象統(tǒng)一由class對象表示。
1. 對象間的關(guān)系
class A(object):
        ...
a = A()
  • Python的三種對象之間,存在著兩種關(guān)系:

is-kind-of關(guān)系: 對應(yīng)于基類子類之間的關(guān)系(object與A)。
is-instance-of關(guān)系: 對應(yīng)于實(shí)例之間的關(guān)系(A與a)。

  • 可以通過__bases__屬性探測一個(gè)對象和哪個(gè)對象存在is-kind-of關(guān)系。
>>>class A(object):
>>>    ...
>>>a = A()
>>>
>>>if __name__ == '__main__':
>>>    print(A.__bases__)
(<class 'object'>,)
  • 可以通過__class__屬性或type方法探測一個(gè)對象和哪個(gè)對象存在is-instance-of關(guān)系。
>>>class A(object):
>>>    ...
>>>a = A()
>>>
>>>if __name__ == '__main__':
>>>    print(A.__class__)
>>>    print(a.__class__)
<class 'type'>
<class '__main__.A'>
  • 可以通過issubclassisinstanceof判斷對象間是否存在is-kind-ofis-instance-of關(guān)系。
>>>class A(object):
>>>    ...
>>>a = A()
>>>
>>>if __name__ == '__main__':
>>>    print(isinstance(a,A))
>>>    print(issubclass(A,object))
True
True
  • 對象之間的關(guān)系圖如下:


2. <class 'type'>和<class 'object'>
  • <class 'type'>是Python中的一種特殊class對象,它可以成為其它c(diǎn)lass的type,這種class對象被稱為metaclass對象。
  • <class 'object'>也是一種特殊class對象,Python中的任何class都必須直接或間接繼承自<class 'object'>。
  • 在Python中,任何一個(gè)對象都有一個(gè)type,可以通過__class__獲得:
  • 任何一個(gè)instance對象type都是一個(gè)class對象
>>>class A(object):
>>>    ...
>>>a = A()
>>>
>>>if __name__ == '__main__':
>>>    print(a.__class__)
<class '__main__.A'>
  • 任何一個(gè)class對象type都是metaclass對象,在大多數(shù)情況下metaclass都是<class 'type'>,對應(yīng)PyType_Type。
>>>class A(object):
>>>    ...
>>>a = A()
>>>
>>>if __name__ == '__main__':
>>>    print(A.__class__)
<class 'type'>
  • 在Python中,任何一個(gè)class對象都直接或間接與<class 'object'>對象之間存在is-kind-of關(guān)系,包括<class 'type'>。
>>>class A(object):
>>>    ...
>>>a = A()
>>>
>>>if __name__ == '__main__':
>>>    print(A.__class__.__bases__)
(<class 'object'>,)
  • <class 'object'>對應(yīng)PyBaseObject_Type
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容