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

  • 魅族18是什么屏幕(魅族18是lcd屏吗)

    魅族18是什么屏幕(魅族18是lcd屏吗)

  • 华为nova7pro如何换壁纸(华为nova7pro如何分屏操作)

    华为nova7pro如何换壁纸(华为nova7pro如何分屏操作)

  • 京东拒收可以全额退款吗(京东拒收收快递费吗)

    京东拒收可以全额退款吗(京东拒收收快递费吗)

  • 数据线接头处破皮修复(数据线接头处破皮还能用么)

    数据线接头处破皮修复(数据线接头处破皮还能用么)

  • 笔记本增加内存条好处(笔记本增加内存条有什么用)

    笔记本增加内存条好处(笔记本增加内存条有什么用)

  • 手机号码可以异地注销吗(手机号码可以异地注销吗移动)

    手机号码可以异地注销吗(手机号码可以异地注销吗移动)

  • 网上退货退款多久到账(网上退货多久收到退款?)

    网上退货退款多久到账(网上退货多久收到退款?)

  • 智行火车票学生票为什么还是原价(智行火车票学生认证不了)

    智行火车票学生票为什么还是原价(智行火车票学生认证不了)

  • 数字视频的产生方式有(数字视频的产生方式有几种)

    数字视频的产生方式有(数字视频的产生方式有几种)

  • 微信视频画质怎么调整(微信视频画质怎么提高)

    微信视频画质怎么调整(微信视频画质怎么提高)

  • 小米8麦克风孔在哪(小米8麦克风孔内有黑色东西)

    小米8麦克风孔在哪(小米8麦克风孔内有黑色东西)

  • 快手为什么没有提现这功能(快手为什么没有亲密关系)

    快手为什么没有提现这功能(快手为什么没有亲密关系)

  • 淘宝客单价是什么意思(淘宝的客单价什么意思)

    淘宝客单价是什么意思(淘宝的客单价什么意思)

  • 苹果蓝牙耳机没声音怎么办(苹果蓝牙耳机没声音)

    苹果蓝牙耳机没声音怎么办(苹果蓝牙耳机没声音)

  • pr怎么看分辨率(pr视频分辨率)

    pr怎么看分辨率(pr视频分辨率)

  • word目录怎么让前几页不算(word目录怎么让页码顶格)

    word目录怎么让前几页不算(word目录怎么让页码顶格)

  • win10农行网银输密码黑屏(农业银行电脑网银密码无法输入)

    win10农行网银输密码黑屏(农业银行电脑网银密码无法输入)

  • x27摄像头怎么出来(x27摄像头怎么出图像)

    x27摄像头怎么出来(x27摄像头怎么出图像)

  • 安检x光对手机有影响吗(安检x光机对手机有影响吗)

    安检x光对手机有影响吗(安检x光机对手机有影响吗)

  • 网络覆盖范围分类(网络覆盖范围分为哪三类)

    网络覆盖范围分类(网络覆盖范围分为哪三类)

  • word两页怎么缩成一页(word文档如何将两页内容缩成一页)

    word两页怎么缩成一页(word文档如何将两页内容缩成一页)

  • 民心网里的内容怎么看(民心网的作用大吗)

    民心网里的内容怎么看(民心网的作用大吗)

  • 华为p系列nova区别(nova p系列 区别)

    华为p系列nova区别(nova p系列 区别)

  •  6sp上市时间(6sp什么时候上市的)

    6sp上市时间(6sp什么时候上市的)

  • Node.js最新版黑马配套笔记(node .js)

    Node.js最新版黑马配套笔记(node .js)

  • 关联方交易金额含税吗
  • 什么是印花税的税目
  • 预算会计退回预付差旅费如何记账?
  • 出口结汇必须要开票吗
  • 建筑行业增值税税负率一般控制在多少合适
  • 增值税抵扣可以跨月吗
  • 实控人变更是利好吗
  • 非居民企业适用的企业所得税税率
  • 开具成品油专用发票时,应遵守哪些规则
  • 债券的投资收益率
  • 公司内帐和外账的区别
  • 劳务报酬所得是什么
  • 成本未取得发票
  • 挂账留底税额如何抵扣?
  • 其他业务收入的核算内容
  • 事业单位自筹事业人员
  • 个人开劳务发票几个点
  • 增值税发票提示文件不匹配
  • 税务领取发票后怎么操作
  • 应交增值税怎么做账务处理
  • 招商引资政府返税政策不兑现
  • 成本费用调整法
  • 兼职劳务费个税怎么算
  • 返利发票税率
  • 损益类科目反映企业在一定期间内利润或亏损,可以分为
  • 鸿蒙系统如何自定义图标
  • 跨年冲减无发票怎么入账
  • php数据表
  • php中session什么意思
  • php简单么
  • 增值税达不到起征点账务处理
  • 没有进项开销项需要交几个点
  • openresty php
  • 生成stl基本过程
  • 银行存款也有窍门
  • 3d representation
  • cat 开源
  • 增值税发票复印件可以入账吗与原件一致
  • 代管资金如何做凭证
  • 销项负数发票需不需要增加库存
  • csv文件导入到pycharm时报错
  • SQLite学习手册(SQLite在线备份)
  • sqlserver数据库大小于对索引有影响吗?
  • 劳务费发票是个人的吗
  • 房地产按揭贷款政策
  • 现金流量表为负数的几种原因
  • 购买性支出和转移性支出的区别
  • 营业净利率和总资产周转率正相关
  • 公司与公司的往来款计入什么科目
  • 未达起征点怎么填
  • 小公司财务做内账流程
  • 资本公积溢价转增
  • 社会组织志愿者参观泉州华侨历史博物馆
  • 购入软件的账务处理
  • 帮其他公司交水费税差
  • 质量问题扣货款会计怎么处理
  • 律师事务所优惠政策
  • 换工作时社保公积金怎么办
  • 建账固定资产的期初科目是什么
  • 企业建账要求
  • sql server 判断数据是否存在
  • sqlserver怎么创建临时表
  • 电脑ahci模式什么意思
  • Centos安装dig命令
  • 微软平板电脑surface pro2参数
  • mfc100udll
  • 怎么把html转换成psd
  • centosgui
  • win10关闭系统服务
  • cocos2dx-js
  • FIF互动帮助手册系列-HTML手册 flash版
  • 仿客齐集首页导航条DIV+CSS+JS [代码实例]
  • javascript中怎么创建一个数组
  • jquery onready
  • jquery循环生成li
  • 焦作国税局官网
  • 进出口备案登记表是哪个部门发的
  • 江西发票税率
  • 税务工作的前景怎么样
  • 从国外寄电吉他要多少钱
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设