大師兄的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'>
- 可以通過issubclass和isinstanceof判斷對象間是否存在is-kind-of和is-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。
