论type与object的关系----Python创世纪
这篇随笔的灵感来源于学习源码时对type及object关系的疑惑,主要参考了这篇论文:
http://www.cs.utexas.edu/~cannata/cs345/Class%20Notes/15%20Python%20Types%20and%20Objects.pdf
1.Object是什么?
计算机的工作过程概括下来就是:读取'数据', 经由'逻辑'运算,输出'结果'
数据在软件中的表示形式,是通过'键'指向存储地址,从而'引用'该地址中的值
所以'程序'在干的事,就是告诉计算机,用什么'数据', 进行什么'逻辑'运算,一言以蔽之,就是操作键值对
这里只谈'数据',不讲'逻辑'
在面向对象中, 我们将键值对分门别类的放好,并封装成一个个对象
'object'就是这样一个东西---python原初的对象.
2.Type又是什么?
先上代码:
>>> object
<class 'object'>
>>> type
<class 'type'> >>> type(object)
<class 'type'>
>>> type(type)
<class 'type'> >>> object.__class__
<class 'type'>
>>> type.__class__
<class 'type'> >>> type.__bases__
(<class 'object'>,)
>>> object.__bases__
()
可以看到,从代码中体现的是:
·object和type都是类(class)
·object和type的类型(type)都是type
·type的父类是object,object则没有父类,源码中描述object为""" The most base type """
接下来看一张图:

图中虚线表示实例化关系,实现表示继承关系,可以看出:
·因为object是type的实例,所以他的子类(list,tupe,dict)都是type的实例,即一个类的实例化对象的派生类也从属于该类
·因为mylist是list的实例,且list又是object的子类,所以mylist也是type的实例,即一个类的实例化对象的实例化对象也从属与该类
现在再说这句话应该会更容易理解:
objcet的type是type,object是type的实例,type是自己的实例
因此两者之间互相依赖对方定义自身,可以说是鸡生蛋和蛋生鸡的关系
3.三生万物
官方文档中有这么一个概念:
Type Objects
Type objects represent the various object types. An object’s type is accessed by the built-in function type(). There are no special operations on types. The standard module types defines names for all standard built-in types.
type objects翻译过来就是类型对象, 其表示各种对象的类型,我们可以使用type()去访问任何对象的类型,type和object都属于Type Objects
结合上面的阐述,可以勾勒出python中'对象'这个概念的全貌:
object和type是两个原初的对象,由他们派生(实例化)的对象也可以分为两类:
·类型对象(type objects)
·非类型对象(non-type object)
他们都是对象,不同的是,类型对象能够实例化新的对象,非类型对象则不可以,例如:
num = int(1)
# num是int实例化的对象,有具体的值,我们不会这么去调用他:num() type(num)
>>> <class 'int'>
type(int)
>>> <class 'type'> obj = object()
type(obj)
>>> <class 'object'>
对象之间的关系,不外乎以下两种:
·父子关系( the subclass-superclass relationship)
·类型实例关系( the type-instance relationship )
# 我们可以通过实例化type来产生新的类型对象,然后再把这个类型实例化,当然,这个新的类型对象也必须继承自object:
type('A', (object,), {num=1})
# 这个写法可以清晰的表明类型对象是type的实例化,但我们在实际写代码的时候一般这样写:
class A(object):
num=1
a = A() # 我们还可以继承type来产生新的元类(metaclass):
class SubType(type):
pass
# 通过新的元类,我们可以造出新的类型对象,
class array(metaclass=SubType):
pass
# 该类型对象的类型则不再是type,而是SubType
type(array)
>>> <class 'SubType'>
他们之间的关系如下图所示:
.
至此,我们完成了从object到type,再到Type Objects,进而'三生万物'的过程,从'对象'这一角度描绘出了Python这门语言的一个轮廓,相信大家都听说过画杨桃的故事,笔者水平尚浅,幸得窥见这一角度,希望在今后能从更多角度出发去观察,从而从二维升级到三维.
论type与object的关系----Python创世纪的更多相关文章
- Python面试题之Python中type和object的关系
知乎上看到的提问: 两个是互为实例的关系,但不是互为子类的关系,只有type是object的子类,反之则不成立. 大牛说两者是蛋生鸡鸡生蛋的关系,但我还是不明白,有懂的麻烦解释一下, 希望不要给出外文 ...
- python 中type和object的关系
转自:https://segmentfault.com/a/1190000008938763 学习python的同学都知道这么几句话 object类是所有新式类的父类. type是所有类的类. 那么t ...
- Python进阶内容(五)--- type和object的关系
面向对象编程(OOP)的两大关系 继承与实现 继承关系: 子类继承自父类(base),可以使用父类的一些方法(method)和属性(attribute) 实现关系: 以类为模板,实例化一个对象,即:对 ...
- Python中type和object
type 所有类是type生成的 a = 1 b = "abc" print("type a:{}".format(type(a))) print(" ...
- python中的type和object详解
关于这篇博客 这篇博客主要描述Python的新风格对象(new-style objects),如下: <type 'type'>和<type 'object'>分别是什么? 用 ...
- Python中type与Object的区别
Python中type与Object的区别 在查看了Python的API后,总算明白了.现在总结如下: 先来看object的说明: Python中关于object的说明很少,甚至只有一句话: clas ...
- python的type和object
在python中一切皆对象,这是个用python的人都知道的概念,以int举例,比如a=2,type下: 发现他的type是int,在python中type就是类,所以a是类int的一个对象,实例是类 ...
- python3中的type与object
在python中,一切皆对象,应该怎么理解呢?? 先来看几个例子: [root@localhost ~]# python3 Python 3.6.3rc1 (default, Feb 26 2018, ...
- type和object
一.定义 1.object是所有新式类的父类 2.type是所有类的类 二.解析 下面通过代码来比较一下object和type的关系(__class__获取所属的类,__bases__获取父 ...
随机推荐
- 2.虚拟机安装的ubuntu全屏显示
虚拟机下面安装了ubuntu系统,显示的屏幕只有那么一小块儿,不知道如何才能全屏,那么如何全屏呢?且看下面经验. 方法/步骤 打开虚拟机,并点击要更改成全屏的那个ubuntu系统的电源 我的虚拟机名字 ...
- HSmartWindowControl 之 摄像头实时显示( 使用 WPF )
1.添加Halcon控件,创建WPF项目 在VS2013中创建一个WPF工程,然后添加halcon的控件和工具包,参见: HSmartWindowControl之安装篇 (Visual Studio ...
- 几款移动跨平台App开发框架比较
整理目前流行的跨平台WebApp开发技术的特点,仅供参考. 每个框架几乎都包含以下特性: 使用 HTML5 + CSS + JavaScript 开发 跨平台重用代码 丰富的UI库 提供访问设备原生A ...
- 最值得拥有的免费Bootstrap后台管理模板
在PHP开发项目中,后台管理因为面向群体相对比较固定,大部分以实现业务逻辑和功能.使用Bootstrap后台模板可以让后端开发很轻松的就展现给客户一个响应式的后台,节约前端开发的时间.下面PHP程序员 ...
- Spring IOC 容器源码分析 - 创建原始 bean 对象
1. 简介 本篇文章是上一篇文章(创建单例 bean 的过程)的延续.在上一篇文章中,我们从战略层面上领略了doCreateBean方法的全过程.本篇文章,我们就从战术的层面上,详细分析doCreat ...
- 201621123018《Java程序设计》第8周学习报告
1. 本周学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 2. 书面作业 1. ArrayList代码分析 1.1 解释ArrayList的contains源代码 contanis方 ...
- [SDOI2011]消耗战(虚树+树形动规)
虚树dp 虚树的主要思想: 不遍历没用的的节点以及没用的子树,从而使复杂度降低到\(\sum\limits k\)(k为询问的节点的总数). 所以怎么办: 只把询问节点和其LCA放入询问的数组中. 1 ...
- 深入理解String类
1.String str = "eee" 和String str = new String("eee")的区别 先看一小段代码, public static v ...
- 跟着刚哥学习Spring框架--JDBC(六)
Spring的JDBC框架 Spring JDBC提供了一套JDBC抽象框架,用于简化JDBC开发. Spring主要提供JDBC模板方式.关系数据库对象化方式.SimpleJdbc方式.事务管理来简 ...
- Postgres 的 JSON / JSONB 类型
从 MySQL 5.7.8 开始,MySQL 支持原生的 JSON 数据类型. 一.介绍 json是对输入的完整拷贝,使用时再去解析,所以它会保留输入的空格,重复键以及顺序等.而jsonb是解析输入后 ...