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

  • 金税盘开票软件换电脑后怎么操作
  • 股权转让后企业注销个人所得税怎么处理
  • 印花税计入什么科目会计分录
  • 税控盘扣税缴税分录怎么写
  • 保洁公司纳税税率
  • 采购服务需要缴什么税
  • 结算业务申请书和转账支票区别
  • 嵌入式软件运行的主要流程是什么
  • 土地使用税怎么终止
  • 工会经费支出无效怎么办
  • 将外购货物分配给客户
  • 收到返还利润可以抵扣吗
  • 开公司前期费用有什么
  • 负债月末正常余额是什么
  • 企业所得税预缴纳税申报表
  • 研发费用报表列报
  • 印花税计提和缴纳凭证
  • 注销怎么做账
  • 营销活动的意义是什么
  • 个税专项扣除有几项
  • 企业无形资产包括
  • 销售商品会计分录怎么写
  • 实收资本和注册资本必须一致吗
  • win11界面不停刷新
  • 行政事业单位职工体检依据
  • 福利费不需要发票
  • qconsvc.exe - qconsvc是什么进程 有什么作用
  • 网络环境中存在不同网段的nvr
  • PHP:session_name()的用法_Session函数
  • 应收罚款收入
  • 固态硬盘近年价格走势
  • 增值税专用发票怎么开
  • La Selva生物站热带雨林树冠上的黑嘴巨嘴鸟,哥斯达黎加 (© Greg Basco/Minden Pictures)
  • yii2权威指南
  • php面向对象优点,缺点
  • 增值税税控系统专用设备费及技术维护费抵扣
  • 【JavaScript 刨根问底之】requestAnimationFrame以及延时器
  • 私人定制ai绘画下载
  • thinkphp制作404跳转页的简单实现方法
  • 教育费附加免税需要计提吗?
  • 应付职工薪酬账户
  • 实收资本的会计处理
  • 帝国cms真的很好用
  • db2导出数据到excel
  • 流动资金与固定资金
  • 国家税务总局就是国税局吗?
  • 合作社分红计入什么科目
  • 未分配利润转增股本要交税吗怎么交
  • 收购发票如何确认成本
  • 农产品加计扣除1%账务处理
  • 实物投资需要缴纳增值税吗
  • 为什么股票配资的都在境外交易
  • 发放外单位人员劳务费需要在发放表上签字吗
  • 存货跌价准备的计算
  • 认证系统维护费可以全额抵扣吗
  • 企业利润分配明细表
  • 工程施工和工程造价哪个好
  • 国家也通过国有企业利用自己的财政资金
  • 年末结账与财务的关系
  • 营业收入和销售收入的比值
  • win7系统出现蓝屏怎么进去桌面
  • centos查看某个端口
  • 如何去掉桌面图标的蓝底
  • schupd.exe - schupd是什么进程 有什么用
  • 2021年win10累积更新
  • win8如何使用
  • win10系统注册名修改
  • perl ne
  • 特效添加
  • js弹出层效果
  • apk反编译是什么意思
  • opengl shader实例
  • jquery 设置checked
  • js正则表达式写法
  • python问题及解决方法
  • 前端开发的工作流程
  • 税务局的前身是什么
  • 地税局 要官
  • 酒店业需要缴纳哪些税
  • 湖南增值税起征点
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设