Python自学成才之路 什么是元类
时间:2022-07-23
本文章向大家介绍Python自学成才之路 什么是元类,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
文章目录
什么是元类?
有这么一个类
class A(object):
pass
a = A()
print(type(a))
输出:
<class '__main__.A'>
类A的实例a类型是<class ‘main.A’>,如果把type用在类A上会输出什么?
print(type(A))
输出:
<class 'type'>
输出结果<class ‘type’>,这个type到底是什么类型,在来看看下面两个案例。
s = "ads"
print(type(s))
print(type(str))
x = 100
print(type(x))
print(type(int))
输出:
<class 'str'>
<class 'type'>
<class 'int'>
<class 'type'>
str和int使用type输出都是<class ‘type’>,这个type很神奇,为何python基本数据类型使用type()返回的是type类型,type()用来类上面返回的也是type类型,难道是这些都没有类型了所有type()没有结果返回就返回了<class ‘type’>。不是的,其实这个type叫做元类。
元类是干什么的?
python中一切都是对象,包括基本的数据类型,函数等都是对象。其实类也是对象,这里很绕,类本身是用来创建对象的,既然类本身也是一个对象,那类这个对象谁类实例化的?是由元类来实例化的。所以上面创建a这个对象实例时过程实际上是: type创建A这个类实例,A这个类实例创建a这个对象实例。
有哪些元类?
要说元类有哪些,顶级元类只有type,但是通过继承type能够实现自定义元类。比如下面这个案例:
class MetaClass(type):
pass
class Demo(metaclass=MetaClass):
pass
可以通过metaclass参数来指定元类,如果没有指定,默认都是使用type这个元类。
为什么要学元类?
元类涉及到python创建对象的生命周期,理解了元类你会对python有一个更深刻的认识,知其然,更要知其所以然。很多优秀的框架都用到了元类编程,比如flask,sqlalchemy等,如果你要阅读这些框架的源码,元类编程是需要懂的。如果你想自己做一些开源框架,那必须要熟练使用元类编程。
既然元类能够创建一个类实例,那么就能在元类中对类做一些手术,通过元类来干预类的创建过程,叫做元编程。
- 我身边的一些数据库事故 (r5笔记第52天)
- 一个清理脚本的改进思路(r5笔记第51天)
- 【专业技术】Python爬虫:抓取手机APP的传输数据
- 海量数据迁移之传输表空间(一) (r5笔记第71天)
- 一条sql语句的改进探索(r5笔记第70天)
- 【专业技术】Node.js 究竟是什么?
- Github 项目推荐 | 用 Pytorch 实现的 WaveNet-Vocoder
- 重启数据库的一场闹剧(r5笔记第68天)
- 【C语言系列】基础语法案例分析(初级篇)
- 一次ORA-00600问题的排查和分析(r5笔记第64、65天)
- SpringMVC入门就这么简单
- pl/sql中的forall简单测试(r5笔记第63天)
- SpringMVC【开发Controller】详解
- 巧用外部表备份历史数据(r5笔记第62天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 虚拟机中centos修改时间的方法
- Ubuntu 18.04 Server 设置静态IP 的方法
- 嵌入式Linux重启QT应用程序的简单办法(基于QT4.8 qws)
- CentOS下MySQL的彻底卸载的几种方法
- centos7中安装Android SDK的方法步骤
- centos配置ssh免密码登录后仍要输入密码的解决方法
- CentOS7.2安装Nginx的方法步骤
- CentOS安装Python2.7与Python2.6并存的方法
- 详解Centos下YUM安装PHP的两种方式
- linux下make命令实现输出高亮的方法
- Ubuntu彻底卸载MySQL、Apache2和Php的方法教程
- linux下如何创建守护进程的步骤
- ubuntu系统中/etc/rc.local和/etc/init.d/rc.local的区别详解
- centos6.8下hadoop3.1.1完全分布式安装指南(推荐)
- 批处理模式下运行 top 命令的方法