关于这部分,很多人特别是小白几乎就没弄明白过,只知道所有的类都继承我们的基类object,实际上这样说是不对的。所以今天我们就来仔细捋一捋这三者之间的关系。我们通过边用代码边说逻辑的方式进行说明。

实例化关系

type两种用法:第一生成一个类,第二返回某个对象的类型。我们这里使用它的第二种用法。首先我们先来测试一下整型:

1
2
3
4
5
6
7
8
9
10
11
>>> a =1
>>> type(a)
<class 'int'>

>>> type(int)
<class 'type'>

>>> type(type)
<class 'type'>

# 也就是:type-->type-->int-->1

接下来我们测试一下字符串和列表用来说明Python的其他内置类型也是具有相同的功能:

1
2
3
4
5
6
7
8
9
10
11
12
>>> a ="envse"  # 字符串
>>> type(a)
<class 'str'>
>>> type(str)
<class 'type'>


>>> a =['envse', 'tests'] # 列表
>>> type(a)
<class 'list'>
>>> type(list)
<class 'type'>

看到这里你可能还有其他的想法,比如类如何?那好,我们试试自己定义的类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
>>> class Student:  # 自定义一个Student类
... pass
...

>>> type(Student)
<class 'type'>


>>> class MyStudent(Student): # MyStudent继承了我们的Student类
... pass
...
>>> type(MyStudent)
<class 'type'>


所以从上面的例子可以看出,Python中所有的对象(包含type本身)都是type的实例化对象。说完了这个我们再来说一下继承关系。

继承关系

我们来看一下它们的继承关系,可以使用__bases__来查看继承关系:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
>>> list.__bases__
(<class 'object'>,)

>>> tuple.__bases__
(<class 'object'>,)

>>> str.__bases__
(<class 'object'>,)

>>> int.__bases__
(<class 'object'>,)



>>> MyStudent.__bases__
(<class '__main__.Student'>,)

>>> Student.__bases__
(<class 'object'>,)


>>> object.__bases__
()

从上面的例子中,我们可以看到除了object类以外,所有的类都是继承于object这个最高的基类。对象不存在继承关系。为了便于理解,我找了一张图片,这个图片讲得非常详细:

图中虚线代表实例化,实线代表继承关系。

我们可以把这些分为3类:
第一类:type自成一类,type是自己的对象(可以实例化自己),type可以把所有的对象变成它的对象(实例化所有对象)

第二类:list、str、dict、tuple等类会继承object类,同时也是type实例化的对象。object是所有类的基类(自身除外的一切类都继承object)

第三类:生成的对象(不具有继承关系)

这样我们就对type、object和class之间的关系就有了一个清晰的认识:所有的object都是type的一个实例,除object之外的所有class都继承于object这一最高基类。