位置: 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描述器有什么用)

  • 推广网店事半功倍(网店网络推广)

    推广网店事半功倍(网店网络推广)

  • 微博浏览记录别人能看到吗(微博浏览记录别的设备登录能查到吗)

    微博浏览记录别人能看到吗(微博浏览记录别的设备登录能查到吗)

  • 抖音语音直播怎么开(抖音语音直播怎么关播)

    抖音语音直播怎么开(抖音语音直播怎么关播)

  • 如何把iphone照片导入电脑(如何把iphone照片导入移动硬盘)

    如何把iphone照片导入电脑(如何把iphone照片导入移动硬盘)

  • 华为手机怎样开启护眼模式(华为手机怎样开空调遥控器)

    华为手机怎样开启护眼模式(华为手机怎样开空调遥控器)

  • 抖音很费电怎么解决(如何解决抖音耗电)

    抖音很费电怎么解决(如何解决抖音耗电)

  • h5链接是什么意思(h5链接格式)

    h5链接是什么意思(h5链接格式)

  • iphonexsmax关机怎么关机(苹果xsmax关机在哪)

    iphonexsmax关机怎么关机(苹果xsmax关机在哪)

  • iphone11怎么关机开机(iphone11怎么关机重启手机)

    iphone11怎么关机开机(iphone11怎么关机重启手机)

  • 联想在哪一年拿下中国个人电脑市场第一(联想几年了)

    联想在哪一年拿下中国个人电脑市场第一(联想几年了)

  • 天猫精灵怎么更新优酷(天猫精灵怎么更换手机号)

    天猫精灵怎么更新优酷(天猫精灵怎么更换手机号)

  • 华为畅连通话收电话费吗(华为畅连通话接听收费吗)

    华为畅连通话收电话费吗(华为畅连通话接听收费吗)

  • oppoa9和a9x的手机壳可以共用吗?(oppoa9和a9x的手机壳可以共用吗)

    oppoa9和a9x的手机壳可以共用吗?(oppoa9和a9x的手机壳可以共用吗)

  • mga82ch a是什么型号(mqa82za/a是什么型号)

    mga82ch a是什么型号(mqa82za/a是什么型号)

  • 空调1匹适合多少平方(空调1匹适合多大房间)

    空调1匹适合多少平方(空调1匹适合多大房间)

  • 抖音怎么对口型步骤(抖音怎么对口型唱歌视频教程)

    抖音怎么对口型步骤(抖音怎么对口型唱歌视频教程)

  • iqoo带nfc功能吗(iqoo手机带nfc功能吗)

    iqoo带nfc功能吗(iqoo手机带nfc功能吗)

  • 苹果11gps怎么打开(iphone11怎么打开gps)

    苹果11gps怎么打开(iphone11怎么打开gps)

  • 荣耀10多少w快充(荣耀10多少w快充充电)

    荣耀10多少w快充(荣耀10多少w快充充电)

  • 手机上的nfc老开(手机常开nfc)

    手机上的nfc老开(手机常开nfc)

  • 一加7有红外吗(一加七有红外吗)

    一加7有红外吗(一加七有红外吗)

  • 苹果xs max老是自动重启是什么情况(苹果xs max老是自动连蓝牙)

    苹果xs max老是自动重启是什么情况(苹果xs max老是自动连蓝牙)

  • vivox27支持5g网络吗(vivox27支持五g网络吗)

    vivox27支持5g网络吗(vivox27支持五g网络吗)

  • 优酷怎么设置只看主角(优酷怎么设置只看谁的片段)

    优酷怎么设置只看主角(优酷怎么设置只看谁的片段)

  • 抖音如何开通蓝v(抖音如何开通蓝v认证需要多少钱)

    抖音如何开通蓝v(抖音如何开通蓝v认证需要多少钱)

  • Win10/Win11如何高效地使用搜索引擎(win11如何降到win10)

    Win10/Win11如何高效地使用搜索引擎(win11如何降到win10)

  • 外商投资企业要实缴资本么
  • 企业当期的所得税费用
  • 光盘税收分类编码是多少
  • 应收账款平均占用资金的变动额
  • 资产负债表存货怎么填列
  • 装卸费和保险费是价外费用吗
  • 2018年城镇医保
  • 红利所得分配也要交税吗
  • 从关联企业获得非工资报酬怎么缴纳个税?
  • 住宿费可以抵扣吗?
  • 国家认定的高新技术企业是什么意思
  • 实收资本的印花税是营业账簿吗
  • 外包的人力费用包括哪些
  • 个体工商户变更法人
  • 财产转移数据缴费怎么交
  • 分公司应收款转总公司会计分录?
  • 没有认缴到位的股票
  • 想买黄金投资怎么做
  • 金融负债包括哪几项
  • 财政拨付专项资金进什么会计科目
  • 跨行汇入会计分录
  • 短期借款应付利息列报
  • 不动产租赁如何缴纳增值税
  • 快启动u盘制作
  • win 11 bug
  • 默认网关和dns怎么填
  • 默认网关不可用怎么修复
  • 房产契税如何计算2021年
  • 投资收益怎么算例题
  • 开发商自用房产出售成为二手房土地成本
  • 补缴税款怎么补
  • 材料采购运杂费包括
  • 源码阅读技巧
  • 免施工许可证
  • php实现多条件查询
  • php gzip压缩
  • js对象数据类型有哪些
  • opencv项目开发实战
  • sql2012存储过程
  • 为什么开票需要提供开户许可证
  • 增值税申报表是含税还是不含税
  • 冲减以前年度管理费用需要更正报表吗
  • 公司进行债券投资的缺点
  • 计提银行存款利息
  • 现金预算包括哪些内容,来源是什么
  • 行政单位资产报告范文
  • 派发股利政策
  • 计提印花税会计分录
  • 投资别人的公司叫什么
  • 缴纳上月附加税怎么做分录
  • 360天认证期是什么时候发布的
  • 资产处置损益如何在利润表中体现
  • 采用现销方式销售商品的会计分录
  • 公司不报税会怎样法人有责任么
  • 一条sql语句搞定一个数据
  • windows vista(service pack1)
  • 怎么看mac的硬盘型号
  • bearshare.exe进程安全吗 bearshare是什么进程
  • 在mac下如何安装软件
  • linux系统编译命令
  • window102021年更新计划
  • win8.1进不了系统
  • win10怎么添加打印机
  • python生成二维码添加图片
  • javascript中的3种继承实现方法
  • JavaScript中的变量名不区分大小写
  • js let语句
  • perl正则表达式匹配 \w \s
  • JavaScript创建数量n由用户决定的数组
  • javascript typeof id==='string'?document.getElementById(id):id解释 原创
  • javascript的简介
  • JavaScript中的数据类型分为两大类
  • js如何判断是否有定时器功能并清除
  • 《简单》阅读答案
  • 江苏电子税务局操作手册
  • 海南省地方税务局公告2017年第2号
  • 村委会税务登记流程
  • 成都市税务局公示名单公布
  • 广西国税发票查询系统
  • 个人所得税法实施条例2011
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设