2022年 11月 8日

python一切皆对象

Python作为动态语言,与其一切皆对象的特性是分不开的。
什么是一切皆对象,就是python中所有的东西都是对象

在python中,一般我们要看一个对象的类型都是用type

基础数据类型如int、str、list、set都是对象

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

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

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

>>>type(set)
<class 'type'>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

我们可以发现所有的基础数据类型都是type类型的,那根据面向对象的思想来说,int、str、list都是type类的实例。但同时int、str、list又能作为数据类实例化变量。

>>>class A:
...    pass

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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

我们发现类其实也是一种claasobj的对象
我们都知道类有继承的特性,在python中查看基类(父类)是调__bases__属性

>>>A.__bases__
(<class 'object'>,)
  • 1
  • 2

我们发现类A其实是默认继承object类的,那type也是一个类,那我们再看type的基类

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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

我们会发现所有的类包括type最终都是要继承object类

>>>type(object)
<class 'type'>
>>>type(type)
<class 'type'>
>>>import time
>>>type(time)
<class 'module'>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

并且object类也是type类的实例对象,就连type自己也是自己的对象。而且我们发现包其实也是一种对象,这也是为什么python的包需要一个__ini__.py的文件

总结下来:

  1. python中一切皆为对象,是因为一切类型都是type这个类的实例
  2. python中所有的类都继承object这个基类,它们既是对象,也能实例化对象
  3. type是类也是对象,底层是通过指针的方式实现自己实例化自己的