Python 元类实例解析


Posted in Python onApril 04, 2018

龟叔发明了 Python,然后集成了一堆概念在这门语言里面,比如:迭代器,装饰器,函数,生成器,类,对象,协程等等。

这些概念对初学者似乎没一个好懂的,不过还有比这更难的概念,它是 Python 世界中的造物主,虽然我们很少去直接使用它,但天天都在用,它就是今天的主角------元类。

今天我的任务就是彻底明白什么是元类,一起看看。

要搞懂元类,我们还是先从对象说起。

对象(Object)

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

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

等号右边是对象,左边是给这些对象取的名字,任何对象都有3个关键属性:标识、值、类型。

标识

标识就和人的身份证ID一样,每个对象有唯一ID标识,在整个生命周期中都不会变,你可以认为标识是这个对象在计算机内存中的地址。通过函数 id() 可以查看对象的ID标识。

>>> id(i)
40592592
>>> id(s)
44980584

对象值

对象的第二个属性是值,值很好理解,比如 i 的值是 10,s 的值是 abc,nums 的值就是 1,2,3。

类型

对象还有一个很重要的属性就是类型,任何对象都有属于自己的类型,对象就是由它的类型构造出来的,比如上面的 i 的类型是 int 类型,这个对象就是由 int 构造出来的。s 类型是字符串类型,nums 的类型是列表类型,dicts 的类型是字典类型,它们都是由对应的类型构建出来的。

通过 type() 可以查看对象的类型。

>>> type(i)
<class 'int'>
>>> type(s)
<class 'str'>
>>> type(nums)
<class 'list'>
>>> type(dicts)
<class 'dict'>

对象的类型也和ID标识一样,确定好之后就不会再变化了。

类与(实例)对象

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

>>> class Person:
  # 这里的 self 指某个实例对象自己
...  def __init__(self, name):
   # name 是实例的属性
...   self.name = name
  # live 是类的属性
  live = True

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

>>> p1 = Person("zhangsan")
>>> p1.name
'zhangsan'
>>>
>>> p2 = Person("lisi")
>>> p2.name
'lisi'

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

>>> p1
<__main__.Person object at 0x0195AA30>
>>> type(p1)
<class '__main__.Person'> # 这里的__main__是模块名称

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

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

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

>>> id(Person)
26564024
>>> type(Person)
<class 'type'>
>>> Person
<class '__main__.Person'>

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

我们来回顾一下,实例对象 p1 的类型是类对象 Person,Person 的类型 type

>>> nums = [1,2,3]
>>> type(nums)
<class 'list'>
>>> type(list)
<class 'type'>

nums 的类型是 list,list 的类型也是 type,字典类(dict)的类型也是 type,所有类的类型都是 type,也就是说所有的类都是由type 创建的。这个 type 就是元类,道生一,一生二,三生万物,元类就是 Python 中的造物主。(元类自己也是对象)

Python 元类实例解析

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

用元类创建类

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

>>> Person = type("Person", (), {"live":True})
>>> Person
<class '__main__.Person'>

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

>>> class Person:
...  live = True
...
>>> Person
<class '__main__.Person'>

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

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

总结

以上所述是小编给大家介绍的 Python 元类实例解析,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
Python部署web开发程序的几种方法
May 05 Python
关于Python正则表达式 findall函数问题详解
Mar 22 Python
python实现数据写入excel表格
Mar 25 Python
PyQt实现界面翻转切换效果
Apr 20 Python
使用Django启动命令行及执行脚本的方法
May 29 Python
Python编程深度学习计算库之numpy
Dec 28 Python
在python中用print()输出多个格式化参数的方法
Jul 16 Python
Mac安装python3的方法步骤
Aug 09 Python
python如何解析复杂sql,实现数据库和表的提取的实例剖析
May 15 Python
Python加速程序运行的方法
Jul 29 Python
python实现数据结构中双向循环链表操作的示例
Oct 09 Python
Python 实现PS滤镜的旋涡特效
Dec 03 Python
对numpy 数组和矩阵的乘法的进一步理解
Apr 04 #Python
Numpy数组的保存与读取方法
Apr 04 #Python
基于Python Numpy的数组array和矩阵matrix详解
Apr 04 #Python
Python基于更相减损术实现求解最大公约数的方法
Apr 04 #Python
Python遍历numpy数组的实例
Apr 04 #Python
基于Python中numpy数组的合并实例讲解
Apr 04 #Python
python实现list由于numpy array的转换
Apr 04 #Python
You might like
php绘图之加载外部图片的方法
2015/01/24 PHP
PHP使用http_build_query()构造URL字符串的方法
2016/04/02 PHP
PHP实现上传多图即时显示与即时删除的方法
2017/05/09 PHP
彻底搞懂JS无缝滚动代码
2007/01/03 Javascript
JQuery EasyUI 数字格式化处理示例
2014/05/05 Javascript
jQuery实现设置、移除文本框默认值功能
2015/01/13 Javascript
js实现接收表单的值并将值拼在表单action后面的方法
2015/11/23 Javascript
ClearTimeout消除闪动实例代码
2016/02/29 Javascript
阿里云ecs服务器中安装部署node.js的步骤
2016/10/08 Javascript
浅析JS中回调函数及用法
2018/07/25 Javascript
详解vue-cli3开发Chrome插件实践
2019/05/29 Javascript
[54:58]完美世界DOTA2联赛PWL S2 LBZS vs Rebirth 第一场 11.25
2020/11/25 DOTA
Python实现的选择排序算法原理与用法实例分析
2017/11/22 Python
Python多线程爬虫实战_爬取糗事百科段子的实例
2017/12/15 Python
python实现用户管理系统
2018/01/10 Python
Python实现判断一个整数是否为回文数算法示例
2019/03/02 Python
Python为何不能用可变对象作为默认参数的值
2019/07/01 Python
搭建python django虚拟环境完整步骤详解
2019/07/08 Python
Django接收post前端返回的json格式数据代码实现
2019/07/31 Python
python爬虫实现获取下一页代码
2020/03/13 Python
python3用PyPDF2解析pdf文件,用正则匹配数据方式
2020/05/12 Python
浅谈pytorch 模型 .pt, .pth, .pkl的区别及模型保存方式
2020/05/25 Python
Python调用shell cmd方法代码示例解析
2020/06/18 Python
Numpy ndarray 多维数组对象的使用
2021/02/10 Python
台湾演唱会订票网站:StubHub台湾
2019/06/11 全球购物
.NET里面如何取得当前的屏幕分辨率
2012/12/06 面试题
车间调度岗位职责
2013/11/30 职场文书
工厂保安员岗位职责
2014/01/31 职场文书
师德师风建设方案
2014/05/08 职场文书
营销与策划专业求职信
2014/06/20 职场文书
支部书记四风问题对照检查材料
2014/10/04 职场文书
群众路线教育实践活动总结
2014/10/30 职场文书
2015年施工员工作总结范文
2015/04/20 职场文书
交通事故赔偿起诉书
2015/05/20 职场文书
结婚主持人致辞
2015/07/28 职场文书
什么是求职信?求职信应包含哪些内容?
2019/08/14 职场文书