Python对象(上)

Python是一门面向对象的语言,在Python中一切都是对象,函数是对象,类型也是对象。函数

下面就看看Python中对象相关的内容。spa

Python对象基本概念

Python对象有三个基本的要素:code

  • 身份:对象的惟一性身份标志,是该对象的内存地址(可用内建函数id()得到)
  • 类型:对象的类型决定了该对象能够保存什么类型的值,可进行什么样的操做(可用内建函数type()得到)
  • 值:对象表明的数据

下面看看如下代码:对象

num =7

print id(num)
print type(num)
print num
print dir(num)

print 

def isEven(num):
    return (num%2 and [False] or [True])[0]
    
print id(isEven)
print type(isEven)
print isEven
print dir(isEven)

 经过代码中能够看到,咱们定义了一个int类型的数值对象,以及一个函数对象,经过内建的dir()函数,咱们能够查看对象支持的属性/方法:blog

Python对象起源

在Python中有两个最基本的对象,<type 'object'> 和 <type 'type'>,这两个对象是全部对象的起源。继承

经过下面的代码看看<type 'object'> 和 <type 'type'>的关系:内存

代码中使用了"__class__"属性来查看对象的类型,以及"__bases__"属性来查看对象的父类,这两个属性很重要,能够查看本对象跟其余对象的关系。class

根据上面代码的输出能够获得下面的对象关系图:容器

在Python对象系统中,<type 'object'>和<type 'type'>的关系就像鸡和蛋的关系,不能说谁先于(建立)谁,二者是相互依赖的,共同构成了Python对象系统的基础。基础

  • <type 'type'>的类型是<type 'type'>(它自己),<type 'type'>的父类是<type 'object'>
  • <type 'object'>的类型是<type 'type'>,<type 'object'>没有父类

介绍到这里是否是感受有点绕,不要紧,咱们继续看看下面关于对象的分类。

Python对象的分类

在Python中,全部的对象能够分红两类:Type Object(类型对象,没错,类型也是一个对象)和Non-type Object(非类型对象)。

下面经过一个具体的例子来看看对象的分类:

根据上面例子的输出能够获得下面的对象关系图:

这里咱们就以list、mylist为例进行分析:

  1. 首先,list是一种Python内置的容器类型,也就是说list是一个类型对象
  2. 根据"__class__"属性能够看到,list这个类型对象的类型是<type 'type'>
  3. 根据"__bases__"属性能够看到,list这个类型对象的父类是<type 'object'>
  4. 经过mylist的"__class__"属性(<type 'list'>)能够看到,mylist是list类型对象生成的一个对象(Non-type Object(非类型对象))

经过上面的分析咱们能够验证Python对象分类的原则:

  • 若是一个对象是<type 'type'>的实例, 那它就是Type Object(类型对象), 不然是Non-type Object(非类型对象)

Type Object和Non-type Object

经过前面的分析能够看到,Type Object(类型对象)包括:

  • <type 'type'>
  • <type 'object'>
  • 经过<type 'type'>生成的对象(类型对象)

Type Object(类型对象)有两个重要的特性:

  • 能够被子类化(subclassed)
  • 能够被实例化(instantiated)

回到上面的对象图,Type Object(类型对象)就是存放在前两个方格中的对象。

那么其他的对象就是Non-type Object(非类型对象),回到对象图,Non-type Object(非类型对象)就是存放在第三个方格中的对象。实线不能出如今第三个方格中,由于这里的对象都不能进行子类化(继承);一样,虚线箭头不能出如今第三个方格中,由于这里的对象都不能进行实例化。

再看<type 'type'>

<type 'type'>自己是一个类型对象;同时,<type 'type'>是全部类型对象(包括<type 'type'>自身)的类型,也就是说,对全部的类型对象进行type()或者获取"__class__"属性都将获得<type 'type'>。

咱们能够导入types模块,而后经过dir()内建函数来查看全部的内置类型对象,这些类型对象的类型都是<type 'type'>:

再看<type 'object'>

一样,<type 'object'>是一个类型对象(由于type(object)是<type 'type'>);同时,<type 'object'>是全部类型对象(除去<type 'object'>自己)的父类

type()和__class__

这里须要提一下的是,type()这个内置函数以及"__class__"这个属性,这两种方式均可以获得对象的类型,通常来讲两种方式获得的结果是相同的。

可是,对于Python中的经典类(classic class),type()和"__class__"的结果就是不一样的了(这里就不介绍classic class和new-style class了):

对于new-style class,type()和"__class__"的结果就是相同的了。

总结

本文介绍了Python对象中的一些基本点:

  • Python对象的三要素
  • Python对象中的两个基本对象<type 'type'>和<type 'object'>
  • Python对象的分类:Type Object(类型对象)和Non-type Object(非类型对象)

经过这些点,应该能够对Python对象有基本的了解。当须要进行对象分析的时候,不妨试试文中使用的对象图,经过这个关系图,能够更加直观的看到对象之间的关系。

相关文章
相关标签/搜索