大师兄的Python源码学习笔记(二十一): 虚拟机中的函数机制(三)
大师兄的Python源码学习笔记(二十三): 虚拟机中的类机制(二)
一、Python中的对象模型
- 在面向对象理论中,有两个核心概念:类和对象,Python中也实现了这两个概念。
- 在Python中,所有东西都是对象,类也是一种对象。
- 在Python2.2之前,实际存在三类对象:
类型 | 说明 |
---|---|
type对象 | 表示Python内置的类型 |
class对象 | 表示Python程序员定义的类型 |
instance对象 | 表示由class对象创建的实例 |
- 在Python2.2之后,type对象和class对象统一由class对象表示。
1. 对象间的关系
class A(object):
...
a = A()
- Python的三种对象之间,存在着两种关系:
is-kind-of关系: 对应于基类与子类之间的关系(object与A)。
is-instance-of关系: 对应于类与实例之间的关系(A与a)。
- 可以通过__bases__属性探测一个对象和哪个对象存在is-kind-of关系。
>>>class A(object):
>>> ...
>>>a = A()
>>>
>>>if __name__ == '__main__':
>>> print(A.__bases__)
(<class 'object'>,)
- 可以通过__class__属性或type方法探测一个对象和哪个对象存在is-instance-of关系。
>>>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关系。
>>>class A(object):
>>> ...
>>>a = A()
>>>
>>>if __name__ == '__main__':
>>> print(isinstance(a,A))
>>> print(issubclass(A,object))
True
True
-
对象之间的关系图如下:
2. <class 'type'>和<class 'object'>
- <class 'type'>是Python中的一种特殊class对象,它可以成为其它class的type,这种class对象被称为metaclass对象。
- <class 'object'>也是一种特殊class对象,Python中的任何class都必须直接或间接继承自<class 'object'>。
- 在Python中,任何一个对象都有一个type,可以通过__class__获得:
- 任何一个instance对象的type都是一个class对象。
>>>class A(object): >>> ... >>>a = A() >>> >>>if __name__ == '__main__': >>> print(a.__class__) <class '__main__.A'>
- 任何一个class对象的type都是metaclass对象,在大多数情况下metaclass都是<class 'type'>,对应PyType_Type。
>>>class A(object): >>> ... >>>a = A() >>> >>>if __name__ == '__main__': >>> print(A.__class__) <class 'type'>
- 在Python中,任何一个class对象都直接或间接与<class 'object'>对象之间存在is-kind-of关系,包括<class 'type'>。
>>>class A(object):
>>> ...
>>>a = A()
>>>
>>>if __name__ == '__main__':
>>> print(A.__class__.__bases__)
(<class 'object'>,)
- <class 'object'>对应PyBaseObject_Type。