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之Python安装
Sep 12 Python
Linux环境下MySQL-python安装过程分享
Feb 02 Python
python实现支持目录FTP上传下载文件的方法
Jun 03 Python
python安装numpy&amp;安装matplotlib&amp; scipy的教程
Nov 02 Python
Python 编码规范(Google Python Style Guide)
May 05 Python
python中如何使用分步式进程计算详解
Mar 22 Python
pandas按行按列遍历Dataframe的几种方式
Oct 23 Python
python使用python-pptx删除ppt某页实例
Feb 14 Python
jupyter lab的目录调整及设置默认浏览器为chrome的方法
Apr 10 Python
python实现在线翻译
Jun 18 Python
Python3以GitHub为例来实现模拟登录和爬取的实例讲解
Jul 30 Python
Python通过队列来实现进程间通信的示例
Oct 14 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 中的4种标记风格介绍
2012/05/10 PHP
php实现在服务器端调整图片大小的方法
2015/06/16 PHP
php微信开发之带参数二维码的使用
2016/08/03 PHP
php基于dom实现读取图书xml格式数据的方法
2017/02/03 PHP
Javascript和Java获取各种form表单信息的简单实例
2014/02/14 Javascript
jquery动态调整div大小使其宽度始终为浏览器宽度
2014/06/06 Javascript
使用nodejs开发cli项目实例
2015/06/03 NodeJs
jQuery鼠标经过方形图片切换成圆边效果代码分享
2015/08/20 Javascript
JavaScript编写九九乘法表(两种任选)
2017/02/04 Javascript
JavaScript函数参数的传递方式详解
2017/03/06 Javascript
移动端效果之Swiper详解
2017/10/09 Javascript
利用jQuery实现简单的拖曳效果实例代码
2017/10/20 jQuery
代码详解JS操作剪贴板
2018/02/11 Javascript
[01:11:11]Alliance vs RNG 2019国际邀请赛淘汰赛 败者组BO1 8.20.mp4
2020/07/19 DOTA
[47:52]DOTA2-DPC中国联赛正赛 iG vs LBZS BO3 第二场 3月4日
2021/03/11 DOTA
对于Python异常处理慎用“except:pass”建议
2015/04/02 Python
Python中不同进制互相转换(二进制、八进制、十进制和十六进制)
2015/04/05 Python
Python中存取文件的4种不同操作
2018/07/02 Python
用python统计代码行的示例(包括空行和注释)
2018/07/24 Python
Django进阶之CSRF的解决
2018/08/01 Python
详解Appium+Python之生成html测试报告
2019/01/04 Python
Python测试模块doctest使用解析
2019/08/10 Python
win10安装tesserocr配置 Python使用tesserocr识别字母数字验证码
2020/01/16 Python
Jupyter notebook无法导入第三方模块的解决方式
2020/04/15 Python
python Pexpect模块的使用
2020/12/25 Python
基于HTML5 FileSystem API的使用介绍
2013/04/24 HTML / CSS
玉兰油美国官网:OLAY美国
2018/10/25 全球购物
婚鞋、新娘鞋、礼服鞋、童鞋:Nina Shoes
2019/09/04 全球购物
如何启动时不需输入用户名与密码
2014/05/09 面试题
Windows和Linux动态库应用异同
2016/04/17 面试题
外国人聘用意向书
2014/04/01 职场文书
小学生操行评语
2014/04/22 职场文书
乡村教师党员四风问题对照检查材料思想汇报
2014/10/08 职场文书
生产车间主任岗位职责
2015/04/08 职场文书
酒店圣诞节活动总结
2015/05/06 职场文书
Python必备技巧之字符数据操作详解
2022/03/23 Python