在python中对象、类型和元类构成了一个微妙的世界。

他们有在这个世界里和平共处,相辅相成。它们遵循着几条亘古不变的定律:

1、python中无处不对象

2、所有对象都有三种特性:id、类型、值

3、每个对象都是由其对应的类创建出来的

下面来逐条进行分析:

1、python中无处不对象

对象是python中对数据的一种抽象的表示。所有能够通过PyObject类型的指针访问的都是对象。

python中的int、tuple、list、dict、set、函数、类以及派生类都是对象,当然类实例化的对象就更应该是对象了吧(这个都不知道的好,语文老师会气死的……………………)。

2、所有对象都有三种特性:id、类型、值

id 其实就是对象在内存中存放的地址。也就是说在内存中开辟了一块空间,用来存放对象的。id其实就相当于你在内存中的身份标识。用内置函数id()可以查询对象的id。

id('a')
2330255367896

类型是生成对象的模型,相当于对象的父母。可以用type()来查看

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

值就是对象中存放的数据。值也是对象的价值所在。所有对象存在的意义就是为了保存各种各样的值。有的对象不会改变,叫不可变对象,例如:数值、字符串、元组。对象的值可以改变的对象叫可变对象,例如:列表,集合,字典。

3、每个对象都是由其对应的类创建出来的

遵循第一条定律,其实模型也是对象,它是由它的父母产生的,它的父母是谁呢?查看方法是一样的。

>>> class A(object):
pass

>>> a= A()
>>> type(a)
<class '__main__.A'>
>>> type(A)
<class 'type'>

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

这里涉及了一个区别:

在py2.X中,新式类需要继承object类,而在py3.x中已经做了更改,在创建所有的类的时候都会默认继承object类。

#py2.79

>>> class A:
... pass
...
>>> A.__bases__
()
>>> class B(object):
... pass
...
>>> B.__bases__
(<type 'object'>,)
>>>
#py3.6
>>> class A:
pass >>> A.__bases__
(<class 'object'>,)

这里又出现了两个问题:

    1,object类是什么?

    2,继承是什么?

我们先说第二个问题:

类可以继承和派生,被继承的类叫超类,父类或者基类(管它怎么叫呢,我们只有知道,它是继承它的类的父母就可以了。。。),继承者叫子类或者派生类(叫什么无所谓,反正它是它父母的孩子,本质是不会改变的。。。PS:这里我说句题外话,某些人经常不认自己的父母或孩子,可是你们永远改变不了你们的血缘关系。)。还可以实现多继承,多继承就是一个子类继承多个父类(现在的社会很多孩子的父亲是不确定的,但是类关系确实明确的。。呵呵....又扯远了,我对这个社会是有多么深的怨念啊。)下面还是用实例说话吧。

>>> class A:
pass
>>> class B:
pass >>> class C(A):
pass >>> class D(A,B):
pass

在这段代码中,C类继承A类,在这个关系中,A就是父类,C就是A的子类。D类同时继承了A类和B类,A类和B类是父类,D同时继承了A和B,所以即时A的子类又是B的子类。

当然继承的知识还有很多,自己可以查一下相关的资料。

再来说说第一个问题:

object类是所有的类的祖宗。这个object其实也是一个对象(python中处处皆对象)。但是这个对象又有一些特别,其他的对象都是一个抽象的对象,而这个object却是一个具体存在的。其他的类或者对象都是通过继承的关系,直接或者间接的继承了object。翻阅所有对象的族谱,最后一定会发现它们的老祖宗就是object。

对象和类型都说完了,剩下的就是说一说元类了。

首先,什么是元类呢?

list,str,int 这些类型是由谁创建的呢。对了,就是元类。元类创建的类不是一般定义的类,它创建的是模版。最根溯源,我们会找到一个特殊的元类,就是type。但是问题又来了我,我们查看type的类型的时候,发现type是由它自身创建的。

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

难道它既是父亲,又是儿子?why?好吧,我们换种查询方式。

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

其实type是以object为模版创建的。

是不是解释通了呢?别着急,如果你足够细心,你还会发现一个小问题。

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

what?  object是由type创建的?

其实创建它们的是一个叫虚拟机的家伙。它是来自另一个世界的。。

python中对象、类型和元类之间的关系的更多相关文章

  1. Python中对象、类型、元类之间的关系

    Python里的对象.类型和元类的关系很微妙也很有意思. 1989年圣诞节期间,上帝很无聊,于是创造了一个世界. 对象 在这个世界的运转有几条定律. 1.一切都是对象 对象(object)是这个世界的 ...

  2. Java中接口与接口和类之间的关系

    接口和接口之间的关系 继承关系 可以多继承,并且可以多层继承 注意: 1.如果多个父接口中有同名的抽象方法,那么子接口只需要实现一次即可 2.如果多个父接口中有同名的默认方法,那么子接口必须重写默认方 ...

  3. python中的单例模式、元类

    单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. ...

  4. python中,ascii,unicode,utf8,gbk之间的关系梳理

    在计算机中,经常遇到编码问题,本节主要梳理下ascii,unicode,utf8,gbk 这几种编码之间的关系. ASCII 计算机中,所有数据都以0和1来表示.在一开始的时候,要表示的内容比较少,人 ...

  5. python中type、class、object之间的关系

    先看一段代码 # -*- coding:UTF-8 -*- __autor__ = 'zhouli' __date__ = '2018/11/13 18:40' a = 1 b = 'abc' pri ...

  6. python中lambda匿名函数与函数之间的关系

  7. python核心高级学习总结6------面向对象进阶之元类

    元类引入 在多数语言中,类就是一组用来描述如何生成对象的代码段,在python中同样如此,但是在python中把类也称为类对象,是的,你没听错,在这里你只要使用class关键字定义了类,其解释器在执行 ...

  8. 小学生绞尽脑汁也学不会的python(面对对象-----类与类之间的关系)

    小学生绞尽脑汁也学不会的python(面对对象-----类与类之间的关系 1. 依赖关系. 最轻的一种关系 在方法中引入另一个类的对象 class Elephant: def __init__(sel ...

  9. Python面向对象02/类的空间问题、类与对象之间的关系、类与类之间的关系

    Python面向对象02/类的空间问题.类与对象之间的关系.类与类之间的关系 目录 Python面向对象02/类的空间问题.类与对象之间的关系.类与类之间的关系 1. 类的空间问题 2. 类与对象之间 ...

随机推荐

  1. C#脏字过滤算法

    public class DirtyWordOper    {        private static Dictionary<string, object> hash = new Di ...

  2. SSM :MyBatis与Spring的整合

    MyBatis与Spring的整合 一:Spring整合MyBatis的准备工作: (1.)在项目中加入Spring,ByBatis及整合相关的jar文件 (2.)建立开发目录结构,创建实体类 (3. ...

  3. 使用Python操作excel文件

    使用的类库 pip install openpyxl 操作实现 工作簿操作 # coding: utf-8 from openpyxl import Workbook # 创建一个excel工作簿 w ...

  4. Oracle常用的数值函数,日期函数

    ---恢复内容开始--- 数值函数 常用的处理数值的函数有如下: No. 函数名 含义 1 round(x[,y]) 返回四舍五入后的值 2 trunc(x[,y]) 不会四舍五入 3 mod(x,y ...

  5. prometheus client_golang使用

    序言 Prometheus是一个开源的监控系统,拥有许多Advanced Feature,他会定期用HTTP协议来pull所监控系统状态进行数据收集,在加上timestamp等数据组织成time se ...

  6. axios跨域

    参考:http://www.ruanyifeng.com/blog/2016/04/cors.html 遇到前后分离情况 前端 a.com 后端 server.a.com 环境 vue全家桶前端 ph ...

  7. 【Mysql知识补充】

    一.子查询 1.定义 子查询是将一个查询语句嵌套在另一个查询语句中.内层查询语句的查询结果,可以为外层查询语句提供查询条件.子查询中可以包含:IN.NOT IN.ANY.ALL.EXISTS 和 NO ...

  8. 软件测试管理QC

    一.QC简介 1)是HP公司的产品,是B/S结构的产品 2)在QC服务器中,打开IE浏览器,在地址栏中输入QC服务器的网址或者IP地址. 查看虚拟机的IP地址: 本地连接-属性-TCP/IP协议(重点 ...

  9. lodash源码分析之chunk的尺与刀

    以不正义开始的事情,必须用罪恶使它巩固. --莎士比亚<麦克白> 最近很多事似乎印证了这句话,一句谎言最后要用一百句谎言来圆谎. 本文为读 lodash 源码的第二篇,后续文章会更新到这个 ...

  10. kvm虚拟机管理 系统自动化安装

    原创博文安装配置KVM http://www.cnblogs.com/elvi/p/7718574.htmlweb管理kvm http://www.cnblogs.com/elvi/p/7718582 ...