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

  • 小米手表color2闹钟怎么设置(小米手表color2闹钟从哪里关闭)

    小米手表color2闹钟怎么设置(小米手表color2闹钟从哪里关闭)

  • 淘宝怎么设置最爱(淘宝怎么设置最晚发货时间)

    淘宝怎么设置最爱(淘宝怎么设置最晚发货时间)

  • 小米10至尊纪念版支持的4G频段有哪些(小米10至尊纪念版上市价格)

    小米10至尊纪念版支持的4G频段有哪些(小米10至尊纪念版上市价格)

  • 表格的表头是指哪里(表头算不算表格)

    表格的表头是指哪里(表头算不算表格)

  • 对于将运行多个虚拟机的计算机两个硬件要求是什么(在多个已运行的应用程序之间进行切换选择的组合键是)

    对于将运行多个虚拟机的计算机两个硬件要求是什么(在多个已运行的应用程序之间进行切换选择的组合键是)

  • 微信是实名认证的吗(微信是实名认证的吗?能查到本人吗)

    微信是实名认证的吗(微信是实名认证的吗?能查到本人吗)

  • qq互联业务登录能干嘛(qq互联业务登录直接被盗)

    qq互联业务登录能干嘛(qq互联业务登录直接被盗)

  • 淘宝个人主页有访客记录吗(淘宝个人主页有哪些功能)

    淘宝个人主页有访客记录吗(淘宝个人主页有哪些功能)

  • excel的视图方式有哪些(excel5种视图)

    excel的视图方式有哪些(excel5种视图)

  • 对方微信停用什么体现(对方微信号停用是什么状况)

    对方微信停用什么体现(对方微信号停用是什么状况)

  • 手机note是什么意思

    手机note是什么意思

  • win10恢复分区能删除吗(win10 恢复分区 作用)

    win10恢复分区能删除吗(win10 恢复分区 作用)

  • 苹果手机键盘上的回车键是哪一个(苹果手机键盘上的字怎么去掉)

    苹果手机键盘上的回车键是哪一个(苹果手机键盘上的字怎么去掉)

  • 微信自动运行在那设置(微信怎么设置自动运行怎么回事)

    微信自动运行在那设置(微信怎么设置自动运行怎么回事)

  • 微信支付手机号码怎么改(微信支付手机号信息确认)

    微信支付手机号码怎么改(微信支付手机号信息确认)

  • 快手两格视频怎么制作(快手两格视频怎么设置)

    快手两格视频怎么制作(快手两格视频怎么设置)

  • 三星s8息屏提醒没了

    三星s8息屏提醒没了

  • airpods电脑能用吗(airpods2电脑能用吗)

    airpods电脑能用吗(airpods2电脑能用吗)

  • 探探可以用了吗(探探可以账号登录吗)

    探探可以用了吗(探探可以账号登录吗)

  • 苹果7支持volte功能吗(苹果支持volte功能吗)

    苹果7支持volte功能吗(苹果支持volte功能吗)

  • 零钱通有隐藏功能吗(微信零钱通有没有隐藏功能)

    零钱通有隐藏功能吗(微信零钱通有没有隐藏功能)

  • 华为盲人模式怎么下滑(华为盲人模式怎么关闭模式快捷键)

    华为盲人模式怎么下滑(华为盲人模式怎么关闭模式快捷键)

  • 清理系统中的组件存储(清理系统所有垃圾)

    清理系统中的组件存储(清理系统所有垃圾)

  • 网页视频播放不了是什么原因详情(网页视频播放不流畅原因)

    网页视频播放不了是什么原因详情(网页视频播放不流畅原因)

  • 解决CentOS 安装出现

    解决CentOS 安装出现"-bash: wget: 未找到命令"解决方案(centos安装软件教程)

  • 税前扣除凭证按照用途分为哪些
  • 汇算退回的所得税分录
  • 小微企业所得税税率2.5% 10% 25%
  • 股东借款怎么转为利润分配
  • 资产减值准备对股票的影响
  • 报销招待费事由有哪些
  • 资产减值损失为什么不能转回
  • 深圳一般纳税人资格查询
  • 这部分房屋是否可以抵押
  • 公益性捐赠税前扣除资格认定
  • 不在境内劳务是否付企业所得税
  • 公司代收生育津贴怎么做账
  • 车船税没有发票吗?
  • 质量问题扣款账务处理
  • 不动产经营租赁印花税税率
  • 代发农民工工资承诺书
  • 税友软件费用
  • 免税项目进项税为什么不可以抵扣
  • 企业合作开发的研发费怎样加计扣除?
  • 自产货物用于捐赠的会计处理
  • 停车管理费什么时候交
  • 工业厂房的辅助用房
  • 营业成本包括哪些会计科目
  • 决算帐表不相符怎么处理
  • 专用发票没有写购买方电话号码
  • 私人公司老板
  • 设备修理费
  • 合并报表抵消子公司当期收入,母公司费用
  • 华为手机找回删除的通讯录号码
  • 腾讯云centos5.8
  • php apc
  • php安装教程详解
  • regsync.exe - regsync是什么进程 有什么用
  • ksysslim.exe是什么
  • 安全模式是个啥
  • regsvr32 shmedia.dll
  • 税务局要求小规模纳税人开专票
  • 成本法转为权益法例题
  • vue的自定义指令怎么用
  • phpstudy配置https
  • 无偿赠送房屋要交税吗
  • php t_string
  • vue数据表
  • php如何实现重载
  • taskset 绑定cpu
  • python魔法方法详解
  • 事件委托js例子
  • mongo 更新数据
  • 织梦相关文章调用
  • 城建税减免性质代码是什么意思
  • 售后领料怎么做会计分录
  • 给员工买保险的好处和坏处
  • 可以直接申请一个微信吗
  • 固定资产减值损失计入
  • 跨年取得的发票金额大于暂估金额
  • 增值税农产品免税
  • 企业刚注册成功又要注销要什么手续
  • 内账税金如何做分录
  • 进口产品内销如何交税
  • 所有者权益的来源包括
  • 结汇是把外币换成人民币吗
  • 为什么到期一次还本付息要用债权投资利息调整
  • Win7系统如何关闭自动更新
  • 微软 win7
  • 电脑winxp系统
  • linux 对比文件
  • 使用无线网络上网电脑的IP地址会改变吗
  • 任务管理器快捷键ctrl+alt+
  • 批量win10激活码怎么弄
  • cocos2d教程
  • Python实现mysql数据库更新表数据接口的功能
  • dos的命令大全
  • unity3d官方教程
  • android studio downloading
  • unity备份工程
  • javascript教程完整版
  • 预征率是2%怎么计算
  • 加强税务工作
  • 建筑企业所交的税项有多少
  • 临沂市2020年居民燃气价格
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设