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

  • 爱奇艺怎么加好友(爱奇艺怎么加好友关注)

    爱奇艺怎么加好友(爱奇艺怎么加好友关注)

  • ios13可以分屏吗(苹果13可以分屏操作吗)

    ios13可以分屏吗(苹果13可以分屏操作吗)

  • 抖音上的在线准吗(抖音的在线准确吗)

    抖音上的在线准吗(抖音的在线准确吗)

  • 重启手机没有提示输入imsi码(重启手机没有提示怎么办)

    重启手机没有提示输入imsi码(重启手机没有提示怎么办)

  • 笔记本充电95充不满(笔记本充电一直是95正常吗)

    笔记本充电95充不满(笔记本充电一直是95正常吗)

  • 魅族小窗模式算切屏吗(魅族小窗算不算切屏)

    魅族小窗模式算切屏吗(魅族小窗算不算切屏)

  • pixiv是什么东西(pixiv是干什么的)

    pixiv是什么东西(pixiv是干什么的)

  • 闲鱼关闭订单是什么意思(闲鱼订单关闭后个人信息卖家还能看见吗?)

    闲鱼关闭订单是什么意思(闲鱼订单关闭后个人信息卖家还能看见吗?)

  • 512kbps能正常看视频吗(512kbps多快)

    512kbps能正常看视频吗(512kbps多快)

  • 校园网是否属于局域网(校园网是否属于校园网)

    校园网是否属于局域网(校园网是否属于校园网)

  • 在关系型数据库中二维表中的一行被称为(在关系型数据库中,一个关系对应一个)

    在关系型数据库中二维表中的一行被称为(在关系型数据库中,一个关系对应一个)

  • 001信号中断怎么做(001信号中断怎么解决高频头前盖破碎能用吗)

    001信号中断怎么做(001信号中断怎么解决高频头前盖破碎能用吗)

  • 华为卸载软件怎么卸(华为卸载软件怎么清理干净手机)

    华为卸载软件怎么卸(华为卸载软件怎么清理干净手机)

  • 魅族16thplus多少瓦充电(魅族16thplus多少钱)

    魅族16thplus多少瓦充电(魅族16thplus多少钱)

  • 朋友圈怎么发50秒视频(发朋友圈赚钱5元一条)

    朋友圈怎么发50秒视频(发朋友圈赚钱5元一条)

  • 已付款怎么取消拼单(已付款怎么取消免密支付)

    已付款怎么取消拼单(已付款怎么取消免密支付)

  • 物联网概念是在哪一年(物联网概念是在( )年美国麻省理工学院提出的?)

    物联网概念是在哪一年(物联网概念是在( )年美国麻省理工学院提出的?)

  • 淘宝店铺动态评分更新时间(淘宝店铺动态评分怎么最快恢复)

    淘宝店铺动态评分更新时间(淘宝店铺动态评分怎么最快恢复)

  • vr眼镜有什么功能

    vr眼镜有什么功能

  • 耳机掉水里会漏电吗(耳机掉水里会漏音吗)

    耳机掉水里会漏电吗(耳机掉水里会漏音吗)

  • nodejs和vue的关系(nodejs vuejs区别)

    nodejs和vue的关系(nodejs vuejs区别)

  • 电脑上爱奇艺怎么完全卸载(电脑上爱奇艺怎么取消自动续费)

    电脑上爱奇艺怎么完全卸载(电脑上爱奇艺怎么取消自动续费)

  • oppor11为啥突然没声音(oppor11为什么会突然关机)

    oppor11为啥突然没声音(oppor11为什么会突然关机)

  • iphone7怎么充电,iphone7正确充电的方法(苹果7充电设置在哪里)

    iphone7怎么充电,iphone7正确充电的方法(苹果7充电设置在哪里)

  • Java对象在内存中的结构(java对象内存大小计算)

    Java对象在内存中的结构(java对象内存大小计算)

  • 公司购买的车辆可以抵扣进项税吗
  • 收到上年度所得税发票
  • 进项税额转出借贷
  • 足浴店装修费用多少
  • 车险 保险金额
  • 关联方需要计提坏账准备吗?
  • 房租押金不退如何
  • 小规模差额申报怎么申报
  • 政府补助收入要交印花税吗
  • 培训发生的差旅费怎么记账
  • 1%是什么税
  • 养老机构提供的养老服务免增值税吗
  • 收到现金货款可以直接用吗
  • 成本未取得发票
  • 债券投资损失准备累计已计提
  • 收到预付款项发票如何入账?
  • 生产成本明细科目是原材料的名称吗
  • 收到海外商务退税如何做账?
  • 小规模纳税人专票开1%还是3%
  • 管理会计的目标包括多选题
  • 个人开劳务发票几个点
  • 财税[2012]15
  • 企事业承包承租方缴纳的管理费税费
  • 出售房产收入计入什么科目
  • etc卡预充值后怎么办
  • 国税申报纳税调整项目怎么填的?
  • 工业企业销售管理制度
  • 生产成本明细账怎么填图片
  • 金融会计风险及防范措施研究目的和意义
  • 房地产销售广告是要约还是要约邀请?原因是什么?
  • windows 10 bug
  • 平均净资产和净资产
  • 如何修复win7系统引导
  • 咨询服务费需要交印花税吗
  • php抓取网页指定内容
  • 实收资本一定要打进公司对公户吗
  • 前端vscode配置
  • js如何随机生成字符串
  • zendframework3
  • 外经证预缴
  • php的中文名
  • 稽查补缴所得税分录
  • 股东分红税率是20%还是25%
  • Vue Router4 ,prams 传参失效和报错问题
  • 从零开始文章
  • php取字符串
  • 税控盘总是连接服务器失败
  • 银行询证函快递费计入什么科目
  • 代扣代缴通用缴款书怎么打印
  • sql2008收缩日志文件
  • 生活服务的行业
  • 库存商品过期报废会计分录
  • 电子银行承兑汇票最长期限
  • 短期借款按月计提的分录
  • 固定资产折旧计算方法公式大全
  • 网络竞价须知
  • 企业所有者权益在数量上等于
  • 工程施工中购买的设备一直未入账需要评估吗
  • 递延所得税与递延所得税费用
  • 企业明细是什么
  • 商品流通的企业
  • xp系统运行怎么打开
  • ubuntu怎么设置开机自启动程序
  • debian更新软件
  • centos云服务器
  • xp系统的硬盘装到win7电脑
  • win8系统无线网络图标不见了
  • windows自带软件有哪些
  • win10的显示
  • php运行时出现找不到该网页
  • win10没有win8好用
  • Qualcom QMI系列-基本知识介绍
  • 医保属于地税还是国税
  • 粮食储备库储备管理自评报告
  • 税务局网上缴税
  • 广东省国家税务总局电子税务局
  • 税务局文化品牌
  • 12月份医保没有到账
  • 金税盘里的发票清单怎么导出
  • 城市维护建设税,教育费附加,地方教育费附加
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设