没有合适的资源?快使用搜索试试~ 我知道了~
源码探秘Cpython.pdf
需积分: 44 15 下载量 108 浏览量
2022-06-27
09:26:22
上传
评论 3
收藏 24.18MB PDF 举报
温馨提示
试读
1408页
源码探秘Cpython.pdf
资源详情
资源评论
资源推荐
《源码探秘 CPython》1. Python中一切皆对象,这里的对象究竟是什么?解密Python
中的对象模型
古明地觉
2022-01-02 23:39
收录于合集
原创
古明地觉的编程教室
#CPython 97个
Python 中一切皆对象
关于 Python,你肯定听过这么一句话:"Python 中一切皆对象"。没错,在 Python 的世界里,一切都是对象。整
数是一个对象、字符串是一个对象、字典是一个对象,甚至 int、str、list 等等,再加上我们使用 class 自定义的
类,它们也是对象。
像 int、str、list 等基本类型,以及我们自定义的类,由于它们可以表示类型,因此我们称之为类型对象;类
型对象实例化得到的对象,我们称之为实例对象。但不管是哪种对象,它们都属于对象。
因此 Python 中面向对象的理念贯彻的非常彻底,面向对象中的"类"和"对象"在 Python 中都是通过"对象"实现的。
在面向对象理论中,存在着"类"和"对象"两个概念,像 int、dict、tuple、以及使用 class 关键字自定义的类型对象实现了面向
对象理论中"类"的概念,而 123、(1, 2, 3),"xxx" 等等这些实例对象则实现了面向对象理论中"对象"的概念。但是在 Python
中,面向对象的"类"和"对象"都是通过对象实现的。
我们举个栗子:
因此可以用一张图来描述面向对象在Python中的体现:
1
2
3
4
5
6
>>> # int
它是一个类,因此它属于类型对象
,
类型对象实例化得到的对象属于实例对象
>>> int
<class 'int'>
>>> int('0123')
123
>>>
类型、对象体系
a 是一个整数(实例对象),其类型是 int(类型对象)。
但是问题来了,按照面向对象的理论来说,对象是由类实例化得到的,这在 Python 中也是适用的。既然是对象,
那么就必定有一个类来实例化它,换句话说对象一定要有类型。至于一个对象的类型是什么,就看这个对象是被谁
实例化的,被谁实例化那么类型就是谁。而我们说 Python 中一切皆对象,所以像 int、str、tuple 这些内置的类型
也是具有相应的类型的,那么它们的类型又是谁呢?
我们使用type函数查看一下就好了。
1
2
3
4
5
6
7
8
>>> a = 123
>>> a
123
>>> type(a)
<class 'int'>
>>> isinstance(a, int)
True
>>>
1
2
3
4
5
6
7
8
9
>>> type(int)
<class 'type'>
>>> type(str)
<class 'type'>
>>> type(dict)
<class 'type'>
>>> type(type)
<class 'type'>
>>>
我们看到类型对象的类型,无一例外都是 type。type 应该是初学 Python 的时候就接触了,当时使用 type 都是
为了查看一个对象的类型,然而 type 的作用远没有这么简单,我们后面会说,总之我们目前看到类型对象的类型
是 type。
所以 int、str 等类型对象是 type 的对象,而 type 我们也称其为元类,表示类型对象的类型。至于 type 本
身,它的类型还是 type,所以它连自己都没放过,把自己都变成自己的对象了。
因此在 Python 中,你能看到的任何对象都是有类型的,我们可以使用 type 函数查看,也可以获取该对象的 __class__ 属性查
看。所以:实例对象、类型对象、元类,Python 中任何一个对象都逃不过这三种身份。
Python 中还有一个特殊的类型(对象),叫做 object,它是所有类型对象的基类。不管是什么类,内置的类也
好,我们自定义的类也罢,它们都继承自 object。因此,object 是所有类型对象的"基类"、或者说"父类"。
因此,综合以上关系,我们可以得到下面这张关系图:
我们自定义的类型也是如此,举个栗子:
在 Python3 中,自定义的类即使不显式的继承 object,也会默认继承自 object。
那么我们自定义再自定义一个子类,继承自 Female 呢?
1
2
3
>>> issubclass(int, object)
True
>>>
1
2
3
4
5
6
class Female:
pass
print(type(Female)) # <class 'type'>
print(issubclass(Female, object)) # True
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
因此上面那张关系图就可以变成下面这样:
我们说可以使用 type 和 __class__ 查看一个对象的类型,并且还可以通过 isinstance 来判断该对象是不是某个已
知类型的实例对象;那如果想查看一个类型对象都继承了哪些类该怎么做呢?我们目前都是使用 issubclass 来判断
某个类型对象是不是另一个已知类型对象的子类,那么可不可以直接获取某个类型对象都继承了哪些类呢?
答案是可以的,方法有三种,我们分别来看一下:
class Female:
pass
class Girl(Female):
pass
#
自定义类的类型都是
type
print(type(Girl)) # <class 'type'>
#
但
Girl
继承自
Female,
所以它是
Female
的子类
print(issubclass(Girl, Female)) # True
#
而
Female
继承自
object,
所以
Girl
也是
object
的子类
print(issubclass(Girl, object)) # True
#
这里需要额外多提一句实例对象
,
我们之前使用
type
得到的都是该类的类型对象
#
换句话说谁实例化得到的它
,
那么对它使用
type
得到的就是谁
print(type(Girl())) # <class '__main__.Girl'>
print(type(Female())) # <class '__main__.Female'>
#
但是我们说
Girl
的父类是
Female, Female
的父类是
object
#
所以
Girl
的实例对象也是
Female
和
object
的实例对象
# Female
的实例对象也是
object
的实例对象
print(isinstance(Girl(), Female)) # True
print(isinstance(Girl(), object)) # True
1
2
3
4
5
6
7
8
9
10
剩余1407页未读,继续阅读
轻声诉说
- 粉丝: 0
- 资源: 9
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0