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

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

Python对象基本概念

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

  • 身份:对象的唯一性身份标志,是该对象的内存地址(可用内建函数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()函数,我们可以查看对象支持的属性/方法:

Python对象起源

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

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

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

根据上面代码的输出可以得到下面的对象关系图:

在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对象有基本的了解。当需要进行对象分析的时候,不妨试试文中使用的对象图,通过这个关系图,可以更加直观的看到对象之间的关系。

Python对象(上)的更多相关文章

  1. pickle和cPickle:Python对象的序列化(上)

    https://segmentfault.com/a/1190000002493548 pickle模块实现了一种算法,将任意一个Python对象转化成一系列字节(byets).此过程也调用了seri ...

  2. python 对象

    python 对象 在python中,对象就是为C中的结构体在堆上申请的一块内存,一般来说,对象是不能被静态初始化的,并且不能再栈空间上生存.本文主要对Python的基本数据类型做简单的介绍. PyO ...

  3. Python 对象的引用计数和拷贝

    Python 对象的引用计数和拷贝 Python是一种面向对象的语言,包括变量.函数.类.模块等等一切皆对象. 在python中,每个对象有以下三个属性: 1.id,每个对象都有一个唯一的身份标识自己 ...

  4. Python对象(译)

    这是一篇我翻译的文章,确实觉得原文写的非常好,简洁清晰 原文链接:http://effbot.org/zone/python-objects.htm ------------------------- ...

  5. Python对象体系揭秘

    Guido用C语言创造了Python,在Python的世界中一切皆为对象. 一.C视角中的Python对象 让我们一起追溯到源头,Python由C语言实现,且向外提供了C的API http://doc ...

  6. python学习笔记:python对象

    一.python对象 python使用对象模型来存储数据,构造任何类型的值都是一个对象.所有的python对象都拥有三个特性:身份.类型和值. 身份:每个对象都有一个唯一的身份标识自己,对象的身份可以 ...

  7. 判断python对象是否可调用的三种方式及其区别

    查找资料,基本上判断python对象是否为可调用的函数,有三种方法 使用内置的callable函数 callable(func) 用于检查对象是否可调用,返回True也可能调用失败,但是返回False ...

  8. 【Python】 python对象的文件化 pickle

    pickle 之前隐隐约约在哪里看到过pickle这个模块但一直没怎么用过.然后让我下定决心学习一下这个模块的原因竟然是[妹抖龙女(男)主在工作中用到了pickle哈哈哈].嗯嗯,不扯皮了.pickl ...

  9. python对象属性管理(2):property管理属性

    使用Property管理属性 python提供了一种友好的getter.setter.deleter类方法的属性管理工具:property. property()是一个内置函数,它返回一个Proper ...

随机推荐

  1. MVC教程五:Action方法的返回类型

    MVC中的Action方法的返回值一般有以下几种: 类型 s说明 EmptyResult 不进行任何操作 ContentResult 将指定内容作为文本输出 JsonResult 输出JSON字符串 ...

  2. springmvc访问静态资源出现Request method 'GET' not supported

    答案最后.:D 默认的访问的URL都会被DispatcherServlet所拦截. 这里说一下如何配置springmvc访问静态文件. <mvc:default-servlet-handler/ ...

  3. maven-parent的pom.xml配置

    //-------------------------------------------system-parent------------------------------------------ ...

  4. Should I expose asynchronous wrappers for synchronous methods?

    Lately I've received several questions along the lines of the following, which I typically summarize ...

  5. 如何进行Java EE性能测试与调优

    性能测试的目标 性能测试不同于功能测试,不是对与错的检验,而是快与慢的衡量.在进行真正的性能测试之前要先搞清楚目标: 1. 在确定的硬件条件下,可以支持的并发数越大越好,响应时间越快越好.具体需要达到 ...

  6. 第三百四十二节,Python分布式爬虫打造搜索引擎Scrapy精讲—爬虫数据保存

    第三百四十二节,Python分布式爬虫打造搜索引擎Scrapy精讲—爬虫数据保存 注意:数据保存的操作都是在pipelines.py文件里操作的 将数据保存为json文件 spider是一个信号检测 ...

  7. SpringBoot系列八:SpringBoot整合消息服务(SpringBoot 整合 ActiveMQ、SpringBoot 整合 RabbitMQ、SpringBoot 整合 Kafka)

    声明:本文来源于MLDN培训视频的课堂笔记,写在这里只是为了方便查阅. 1.概念:SpringBoot 整合消息服务 2.具体内容 对于异步消息组件在实际的应用之中会有两类: · JMS:代表作就是 ...

  8. ASP.NET MVC使用Oauth2.0实现身份验证

    随着软件的不断发展,出现了更多的身份验证使用场景,除了典型的服务器与客户端之间的身份验证外还有,如服务与服务之间的(如微服务架构).服务器与多种客户端的(如PC.移动.Web等),甚至还有需要以服务的 ...

  9. Lua------------------unity与lua的热更新

    [Unity3D]Unity3D游戏开发之Lua与游戏的不解之缘终结篇:UniLua热更新完全解读 标签: 游戏开发游戏解决方案用户体验unity3d 2014-10-18 23:23 7680人阅读 ...

  10. UnityEditor--------------之Selection类的变量解析

    UnityEditor的Selection类 Unity官方文档:https://docs.unity3d.com/ScriptReference/Selection.html Selection S ...