龟叔发明了Python,然后集成了一堆概念在这门语言里面,比如:迭代器,装饰器,函数,生成器,类,对象,协程等等。
这些概念对初学者似乎没一个好懂的,不过还有比这更难的概念,它是Python世界中的造物主,虽然我们很少去直接使用它,但天天都在用,它就是今天的主角--元类。
要搞懂元类,我们还是先从对象说起。

对象(Object)

Python中一切皆对象,这句话你一定有听说过(现在你就听说了),一个数字是对象,一个字符串是对象,一个列表是对象,一个字典是对象,例如:

i=10
s='abc'
nums=[1,2,3]
dicts={"name":"zeng"}

等号右边是对象,左边是给这些对象取的名字,任何对象都有3个关键属性:标识、值、类型。
标识
标识就和人的身份证ID一样,每个对象有唯一ID标识,在整个生命周期中都不会变,你可以认为标识是这个对象在计算机内存中的地址。通过函数 id()可以查看对象的ID标识。

print("对象的唯一标识为:"+str(id(i)))
对象的唯一标识为:1704834400
print("对象的唯一标识为:"+str(id(dicts)))
对象的唯一标识为:1918903679592

对象值
对象的第二个属性是值,值很好理解,比如 i 的值是 10,s 的值是 abc,nums 的值就是 1,2,3。
类型
对象还有一个很重要的属性就是类型,任何对象都有属于自己的类型,对象就是由它的类型构造出来的。
比如上面i的类型是int类型,s的类型是字符串类型,nums的类型是列表类型,dicts的类型是字典类型,它们都是由对应的类型构建出来的。
通过type()可以查看对象的类型。

print("对象的类型为:"+str(type(i)))
print("对象的类型为:"+str(type(dicts)))
对象的类型为:<class 'int'>
对象的类型为:<class 'dict'>

对象的类型也和ID标识一样不会改变。唯一可能变的就是值。

除了系统已经定义好了的整数类型,字符串类型,列表等类型之外,我们还可以创建自己的类型,用关键字class来定义。例如:

class Person(object):#__init__()有点像构造函数,实例化类时调用def __init__(self,name,gender):#name是实例的属性self.name = nameself.gender = gender#live是类的属性live = True

这里的 Person 就是自定义类,类是一个抽象的模版,既不是指张三也不是李四等具体的人,现在我们可以通过调用这个类来构造(实例化)出一个具体的,实在的,有名字的对象出来,这个对象称之为实例对象(Instance)。

类与(实例)对象

p1 = Person ("zhangan","男")
print(p1.name)
p2 = Person ("lisi","女")
print(p2.name)
zhangan
lisi

这里的 p1、p2 就是实例化之后的(实例instance)对象,这两个对象的类型都是 Person 类,类与(实例)对象的关系就像一个车辆模具与一辆被造出来的真实车的关系一样。如下所示:

print(p1)
print(id(p1))
print(type(p1))
<__main__.Person object at 0x000002031271BBE0>
2212217600992
<class '__main__.Person'>

类也是对象(又叫类对象)

刚刚我们说了一切都是对象,实例(真实的车)是对象,类(模具车)当然也是对象,因为它也是实实在在存在的东西。

当 Python 解释器执行到关键字 class 这个指令的时候,在内部就会创建一个名为 “Person” 的类,这个类也是个对象,我们称之为类对象(注意区别实例对象),它一样有ID标识、有类型、有值。例如:

print(Person)
print(id(Person))
print(type(Person))
<class '__main__.Person'>
2446546123192
<class 'type'>

我们注意到Person这个类对象的类型叫“type”,也就是说Person类是由type创建出来的,现在你要记住,p1,p2 是实例对象,而Person是类对象,实例对象p1的类型是类对象Person,Person的类型是type。另外,这个type是什么鬼?

我们来回顾一下:

i=10
print("对象的类型为:"+str(type(i)))
print("对象的类型为:"+str(type(int)))
对象的类型为:<class 'int'>
对象的类型为:<class 'type'>

i的类型是int,int的类型也是type,所有类的类型都是type,也就是说所有的类都是由type创建的。这个type就是元类(metaclass),元类是用于创建类的类,道生一,一生二,三生万物,元类就是Python中的造物主。(元类自己也是对象)

现在我们都知道类(对象)可以使用class关键字创建,我们还知道类(对象)的类型是type,既然知道了它的类型是type,那么肯定可以通过type(元类)来创建。

用元类创建类

前面讲到过,type有一个作用是用于检查对象的类型,其实它还有另外一个作用就是作为元类动态地创建类(对象)。

Person1 = type("Person1", (), {"live":True})
print(Person1)

Person就是一个类,它等价于:

class Person1:live = True
print(Person1)
<class '__main__.Person1'>

用元类type创建类的语法是:

type(类名,父类元组(可以为空), 属性字典)

小结
Python中一切皆为对象,类是对象,元类也是对象,元类是用于创建类的类。

本文章参考公众号【python之禅】,非常感谢!
链接:https://mp.weixin.qq.com/s/UTFQgu4q5pHFyQZBWA9qpA

【Python】对象、类、元类相关推荐

  1. [转]深刻理解Python中的元类(metaclass)

    类也是对象 在理解元类之前,你需要先掌握Python中的类.Python中类的概念借鉴于Smalltalk,这显得有些奇特.在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段.在Pytho ...

  2. Python中的元类是什么?

    元类是什么,我们将它们用于什么? #1楼 请注意,此答案适用于2008年编写的Python 2.x,元类在3.x中略有不同. 元类是使"类"工作的秘诀. 新样式对象的默认元类称为& ...

  3. Python中的元类(metaclass)

    类也是对象 在理解元类之前,你需要先掌握Python中的类.Python中类的概念借鉴于Smalltalk,这显得有些奇特.在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段.在Pytho ...

  4. 深刻理解Python中的元类(metaclass)以及元类实现单例模式

    在看一些框架源代码的过程中碰到很多元类的实例,看起来很吃力很晦涩:在看python cookbook中关于元类创建单例模式的那一节有些疑惑.因此花了几天时间研究下元类这个概念.通过学习元类,我对pyt ...

  5. Python基础:元类

    一.概述 二.经典阐述 三.核心总结 1.类的创建过程 2.元类的使用惯例 四.简单案例 1.默认行为 2.使用元类 五.实践为王 一.概述 Python虽然是多范式的编程语言,但它的数据模型却是 纯 ...

  6. 用来表示python代码块的是什么_三分钟带你用简单的Python代码深入理解Python中的元类...

    互联网的数据爆炸式的增长,而利用 Python 爬虫我们可以获取大量有价值的数据 类也是对象 在理解元类前,需要先掌握Python中的类.在大多数编程语言中,类就是一组描述如何生成对象的代码段.在Py ...

  7. 深入理解Python中的元类(metaclass)

    注:本文原稿来自stackoverflow,原文链接,目前已收获5k高赞. 一.类也是对象 在理解元类之前,你需要先掌握Python中的类.Python中类的概念借鉴于Smalltalk,这显得有些奇 ...

  8. Python中的元类及元类实现的单例模式

    https://www.cnblogs.com/tkqasn/p/6524879.html 在看一些框架源代码的过程中碰到很多元类的实例,看起来很吃力很晦涩:在看python cookbook中关于元 ...

  9. python中的元类_Python中的元类(metaclass)

    提问者自称已经掌握了有关Python OOP编程中的各种概念,但始终觉得元类(metaclass)难以理解.他知道这肯定和自身有关,但仍然觉得不太明白,希望大家可以给出一些实际的例子和代码片段以帮助理 ...

  10. python中的元类_理解python中的元类

    一,理解类也是对象 在python中类同样也是一种对象,只要使用关键字class,Python解释器在执行的时候就会创建一个对象,这个对象(类)自身拥有创建对象(类实例)的能力,这就是为什么他是一个类 ...

最新文章

  1. Java数组中文排序_Java模块 -- 数组/集合中文汉字排序(支持生僻汉字)
  2. js 选择 checkbox
  3. Pylearn2之YAML
  4. Java八大基本数据类型和对应的封装类型
  5. Visual formatting model(图)
  6. c语言程序设计算机基础知识,2018春C语言程序设计(合肥工业大学)
  7. 面向对象(OOP)一
  8. java中的内存一般分成几部分?
  9. 【Elasticsearch】如何解析集群命令
  10. w10自动删除文件怎么关了_回收站删除的文件怎么恢复?
  11. SpringBoot注解分析
  12. 【转贴】没有div没有float没有clear没有hack的超强CSS布局
  13. mac下自动保存 Git SSH Key 密码
  14. 时间序列分析导论书摘:确定自回归过程的阶数
  15. MsChart控件在VC++中的使用(VS2013+MFC+对话框)
  16. Scrapy爬虫快速入门
  17. 自然人如何在浙江法院网上完成诉讼——具体流程
  18. 实现商品库存信息管理页面
  19. 深入理解JVM之四:详解垃圾收集器
  20. java课设超市收银系统_基于jsp的超市收银系统-JavaEE实现超市收银系统 - java项目源码...

热门文章

  1. 计算机win7无法安装,新机装不了Win7?照这个方法5分钟搞定!
  2. android获取3g或wifi流量信息,Android代碼----android獲取3G或wifi流量信息
  3. bool类型数组转换成一个整数_「PHP」常用的数组键值操作函数,面试重点
  4. 排序算法——归并排序的相关问题
  5. Java常用设计模式————组合模式
  6. oracle数据库sql的执行过程,Oracle体系结构之SQL语句的执行过程
  7. php李捷,【问题解答】蝶泳手外划的作用
  8. https脚本调linux执行器,linux平台下一键配置网站https
  9. 基于java SSM springboot动物检疫信息管理系统设计和实现
  10. HTML+CSS+JS实现 ❤️人物走悬崖小游戏❤️