位置: IT常识 - 正文

详解Python元类(metaclass)(python 元类 详解)

编辑:rootadmin

推荐整理分享详解Python元类(metaclass)(python 元类 详解),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:python元组操作方法,python 元素类型,python元组操作方法,python元数据,python中元组的用法,python元数据,python 元类 详解,python 元类 详解,内容如对您有帮助,希望把文章链接给更多的朋友!

什么是元类?

理解元类(metaclass)之前,我们先了解下Python中的OOP和类(Class)。

面向对象全称 Object Oriented Programming 简称OOP,这种编程思想被大家所熟知。它是把对象作为一个程序的基本单元,把数据和功能封装在里面,能够实现很好的复用性,灵活性和扩展性。OOP中有2个基本概念:类和对象:

类是描述如何创建一个对象的代码段,用来描述具有相同的属性和方法的对象的集合,它定义了该集合中每个对象所共有的属性和方法

对象是类的实例(Instance)。

我们举个例子:

In:classObjectCreator(object):...:pass...:In:my_object=ObjectCreator()In:my_objectOut:<__main__.ObjectCreatorat0x1082bbef0>

而Python中的类并不是仅限于此:

In:print(ObjectCreator)<class'__main__.ObjectCreator'>

ObjectCreator竟然可以被print,所以它的类也是对象!既然类是对象,你就能动态地创建它们,就像创建任何对象那样。我在日常工作里面就会有这种动态创建类的需求,比如在mock数据的时候,现在有个函数func接收一个参数:

In:deffunc(instance):...:print(instance.a,instance.b)...:print(instance.method_a(10))...:

正常使用起来传入的instance是符合需求的(有a、b属性和method_a方法),但是当我想单独调试func的时候,需要「造」一个,假如不用元类,应该是这样写:

In:defgenerate_cls(a,b):...:classFake(object):...:defmethod_a(self,n):...:returnn...:Fake.a=a...:Fake.b=b...:returnFake...:In:ins=generate_cls(1,2)()In:ins.a,ins.b,ins.method_a(10)Out:(1,2,10)详解Python元类(metaclass)(python 元类 详解)

你会发现这不算算是「动态创建」的:

类名(Fake)不方便改变

要创建的类需要的属性和方法越多,就要对应的加码,不灵活。

我平时怎么做呢:

In:defmethod_a(self,n):...:returnn...:In:ins=type('Fake',(),{'a':1,'b':2,'method_a':method_a})()In:ins.a,ins.b,ins.method_a(10)Out:(1,2,10)

到了这里,引出了type函数。本来它用来能让你了解一个对象的类型:

In:type(1)Out:intIn:type('1')Out:strIn:type(ObjectCreator)Out:typeIn:type(ObjectCreator())Out:__main__.ObjectCreator

另外,type如上所说还可以动态地创建类:type可以把对于类的描述作为参数,并返回一个类。

用来创建类的东东就是「元类」

MyClass=type('MyClass',(),{})

这种用法就是由于type实际上是一个元类,作为元类的type在Python中被用于在后台创建所有的类。在Python语言上有个说法「Everything is an object」。包整数、字符串、函数和类... 所有这些都是对象。所有这些都是由一个类创建的:

In:age=35In:age.__class__Out:intIn:name='bob'In:name.__class__Out:str...

现在,任何__class__中的特定__class__是什么?

In:age.__class__.__class__Out:typeIn:name.__class__.__class__Out:type...

如果你愿意,你可以把type称为「类工厂」。type是Python中内建元类,当然,你也可以创建你自己的元类。

创建自己的元类

Python2创建类的时候,可以添加一个__metaclass__属性:

classFoo(object):__metaclass__=something...[...]

如果你这样做,Python会使用元类来创建Foo这个类。Python会在类定义中寻找__metaclass__。如果找到它,Python会用它来创建对象类Foo。如果没有找到它,Python将使用type来创建这个类。

在Python3中语法改变了一下:

classSimple1(object,metaclass=something...):[...]
本文链接地址:https://www.jiuchutong.com/zhishi/303121.html 转载请保留说明!

上一篇:Docker 搭建 Nexus3 私服 | 基本操作(Docker 搭建api)

下一篇:Python中的描述符(python描述器有什么用)

  • 腾讯会议的举手键在哪里(腾讯会议的举手功能怎么开启)

    腾讯会议的举手键在哪里(腾讯会议的举手功能怎么开启)

  • 快手怎么取消关注(快手怎么取消关系设置)

    快手怎么取消关注(快手怎么取消关系设置)

  • 荣耀v7pro平板有高刷吗(荣耀v7pro平板有没有指纹)

    荣耀v7pro平板有高刷吗(荣耀v7pro平板有没有指纹)

  • 抖音视频怎么合拍同框(抖音视频怎么合拍)

    抖音视频怎么合拍同框(抖音视频怎么合拍)

  • 萤石云设备添加不上(萤石云设备添加失败)

    萤石云设备添加不上(萤石云设备添加失败)

  • 微信太阳表情的意思(微信表情包太阳)

    微信太阳表情的意思(微信表情包太阳)

  • 手机长度多少厘米(手机长度多少厘米OPPO)

    手机长度多少厘米(手机长度多少厘米OPPO)

  • 文件夹改不了名字怎么办(文件夹改不了名怎么回事?)

    文件夹改不了名字怎么办(文件夹改不了名怎么回事?)

  • oppor17指纹录入不上怎么办(oppor17指纹录入界面)

    oppor17指纹录入不上怎么办(oppor17指纹录入界面)

  • 注销闲鱼账号影响淘宝吗(注销闲鱼账号会影响淘宝吗)

    注销闲鱼账号影响淘宝吗(注销闲鱼账号会影响淘宝吗)

  • 华为nova7指纹解锁怎么设置(华为nova7指纹解锁样式)

    华为nova7指纹解锁怎么设置(华为nova7指纹解锁样式)

  • ios设备是什么意思(iphone设备)

    ios设备是什么意思(iphone设备)

  • 如何下载视频到手机里(如何下载视频到内存卡)

    如何下载视频到手机里(如何下载视频到内存卡)

  • 华为nxtdl00是全网通吗

    华为nxtdl00是全网通吗

  • 菜鸟仓发货是什么意思(淘宝菜鸟仓库发货什么意思?)

    菜鸟仓发货是什么意思(淘宝菜鸟仓库发货什么意思?)

  • 苹果11pro有夜景模式吗(苹果11pro夜景拍照模式在哪)

    苹果11pro有夜景模式吗(苹果11pro夜景拍照模式在哪)

  • 饿了么怎么删除订单记录(饿了么怎么删除商品分类)

    饿了么怎么删除订单记录(饿了么怎么删除商品分类)

  • 如何取消小米上拉搜索(如何取消小米上滑解锁)

    如何取消小米上拉搜索(如何取消小米上滑解锁)

  • 爱奇艺账号注销要多久成功(爱奇艺账号注销了怎么恢复)

    爱奇艺账号注销要多久成功(爱奇艺账号注销了怎么恢复)

  • 一加7pro可以插耳机吗(一加7pro能插耳机吗)

    一加7pro可以插耳机吗(一加7pro能插耳机吗)

  • facetime在哪里设置(facetime怎么搞)

    facetime在哪里设置(facetime怎么搞)

  • 什么软件可以消除美颜(什么软件可以消除照片多余的人)

    什么软件可以消除美颜(什么软件可以消除照片多余的人)

  • 荣耀9xpro有nfc吗

    荣耀9xpro有nfc吗

  • 小度怎么打电话(小度怎么打电话怎么设置)

    小度怎么打电话(小度怎么打电话怎么设置)

  • 斗鱼怎么撤销实名认证(斗鱼怎样取消实名认证)

    斗鱼怎么撤销实名认证(斗鱼怎样取消实名认证)

  • RLS递归最小二乘法(Recursive Least Squares)(递归最小二乘法辨识参数)

    RLS递归最小二乘法(Recursive Least Squares)(递归最小二乘法辨识参数)

  • 帝国cms使用js+css实现当前栏目高亮效果的方法(帝国cms使用redis)

    帝国cms使用js+css实现当前栏目高亮效果的方法(帝国cms使用redis)

  • 社保的滞纳金放什么科目
  • 零申报公司注销麻烦吗
  • 有形动产租赁属于应税劳务还是应税货物
  • 增值税专票如何添加商品名称
  • 工资用现金发放有风险吗?
  • 小规模纳税人缴纳上月应交增值税
  • 原材料入库是付款凭证吗
  • 调整上年度所得税计提分录
  • 应收帐款坏帐损失摘要
  • 发票未能在汇算清缴前取得怎么办?
  • 携程只有电子发票吗
  • 申报附加专项扣除
  • 印花税的缴纳方式包括
  • 公司收到政府科技创新奖
  • win7系统中回收站的内容清空后还能恢复吗
  • 出差人员差旅费作细的说明叫什么
  • 电脑运行时cpu温度
  • 如何将iphone照片导入电脑里
  • 哪些行业可以简易征收增值税
  • 前端文件预览
  • 克拉莫16首
  • 关于减肥的好方法
  • 设备拆修痕迹影响大吗
  • uni-app list
  • 融资性售后回租承租方为什么不交税
  • js解耦
  • 利息资本化怎么计算
  • yolov3图像识别
  • mac m1 安装windows
  • 资本化的后续支出
  • 与上级往来的会计科目的题目
  • url静态化怎么操作
  • 帝国cms模型
  • 税控盘每年要交年费吗
  • 发票跨月还可以作废吗
  • 采购成本和销售成本的核算
  • 工资税预扣
  • 职工报销的医药费是什么
  • 小规模纳税人免税政策2022
  • 领款单有法律效力吗
  • 暂估成本发票来了怎么做分录
  • 财务报告分析主要内容
  • 电子发票报销后退款
  • 无形资产出售时累计摊销为什么在借方
  • 淘宝卖家运费险为什么越来越贵
  • 购入软件的账务处理
  • 委托生产产品
  • 期末调汇汇兑损益科目
  • 销售完一定要结工资吗
  • 公司提前扣员工保险合法吗
  • 有借必有贷借贷必相等的记账规则适用于
  • 个体工商户可以变更法人吗
  • 收到银行结息收入怎么做会计分录
  • 多计提的税款会计处理
  • 商业银行的固定资产
  • windows vista安装光盘进入dos
  • win8.1开机密码忘了
  • ARP欺骗攻击原理
  • linux怎么修改
  • win8怎么进系统
  • xp系统1
  • 电脑怎么装双系统win10和linux
  • 高县土火锅历史介绍
  • Linux系统中sort排序命令的使用教程
  • java操作windows的文件管理器
  • quickres.exe - quickres是什么进程 作用是什么
  • 安卓图像处理app
  • 计算机网络设计
  • javascript的
  • js的定时器函数
  • 文件夹怎么变成
  • 安卓判断横竖屏
  • jquery网页制作
  • javascript教程完整版
  • javascript截图找图
  • 未清卡会锁死吗?
  • 税务部门客服
  • 中国税务社保缴费app下载
  • 增值税发票税控盘开票软件怎么下载
  • 企业演讲稿 英文
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设