在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. Java字符编码

    今天在往oracle数据库里插入数据时发现,往一个20字节的字段里插入8个汉字加上一个括号,并没有提示字段超长.猜想数据库应该并没有用万国码(utf-8). 查询数据库编码sql:select * f ...

  2. 72、django之简单验证码实现与form表单钩子函数补充

    本篇主要讲解简单的验证码实现,验证码使用基本都是找现成的组件来实现,用代码实现这个简单功能主要是了解了解验证码内部的实现. 本篇导航: 五位验证码图示 代码实现 登录验证 Form组件钩子函数补充 一 ...

  3. canvas图表(3) - 饼图

    原文地址:canvas图表(3) - 饼图 这几天把canvas图表都优化了下,动画效果更加出色了,可以说很逼近echart了.刚刚写完的饼图,非常好的实现了既定的功能,交互的动画效果也是很棒的. 效 ...

  4. 移动端h5拍照压缩即时上传后台并预览

    项目经理让迭代一个功能,实时预览并上传到后台的功能,听到这立马想起了几个第三方插件去实现,mui  和api cloude万万没想到的是这个app前面使用ios 和安卓原生写的,然后mui和api c ...

  5. canvas动画3:交互

    canvas动画3 时隔很久,本人终于又写博客了(重度拖延症),把之前留下的canvas交互动画讲一讲. 电脑上的交互,指的是鼠标和键盘,我们今天主要用的是鼠标. 既然是鼠标的话,就要获取鼠标的各种事 ...

  6. 如何有效的去使用一款免费的ERP

    现在市场上免费的软件不少,怎么样去使用一款免费产品是很多人比较头疼的事情. 一般使用免费ERP软件的基本都是小企业,没用过想用又舍不得花钱.如果企业有懂数据库这块儿的管理员,那都还好.如果没有,那建议 ...

  7. HTML5学习指导路线

    HTML5是现在热门的技术,经过8年的艰苦努力,该标准规范终于制定完成,在这里为想要学习HTML5初级程序员详细划分一下学习内容和步骤,让大家清楚的知道HTML5需要学什么?能够快速掌握HTML5开发 ...

  8. LayoutInflater (转)

    在实际开发中LayoutInflater这个类还是非常有用的,它的作用类似于findViewById().不同点是LayoutInflater是用来找res/layout/下的xml布局文件,并且实例 ...

  9. 基于ESXI6.5的服务器基本配置(HP DL388 Gen 9)

    最近一段时间由于做毕业设计的原因,一直处于忙碌状态,刚做完毕业设计,导师处于项目的原因,买了一台惠普服务器(人民币1.7万),服务器自带的内存仅有16 G,硬盘也就只有600G,而且磁盘还做了raid ...

  10. JAVA提高十九:WeakHashMap&EnumMap&LinkedHashMap&LinkedHashSet深入分析

    因为最近工作太忙了,连续的晚上支撑和上班,因此没有精力来写下这篇博客,今天上午正好有一点空,因此来复习一下不太常用的集合体系大家族中的几个类:WeakHashMap&EnumMap&L ...