位置: IT常识 - 正文

详解Python元类(metaclass)(python 元类 详解)

发布时间:2024-01-20

推荐整理分享详解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描述器有什么用)

  • iphone13pro怎么打开5g(iphone13pro怎么打开nfc)

    iphone13pro怎么打开5g(iphone13pro怎么打开nfc)

  • 微信个性签名在哪里设置(微信个性签名在哪里更改设置)

    微信个性签名在哪里设置(微信个性签名在哪里更改设置)

  • 电脑内存不够买什么盘(电脑内存不够买u盘有用吗)

    电脑内存不够买什么盘(电脑内存不够买u盘有用吗)

  • 为什么微信突然用不了了(为什么微信突然要绑定银行卡了)

    为什么微信突然用不了了(为什么微信突然要绑定银行卡了)

  • 华为怎么关闭省电模式提示(华为怎么关闭省流量)

    华为怎么关闭省电模式提示(华为怎么关闭省流量)

  • 抖音重复播放算次数吗(抖音重复播放会重复消耗流量吗)

    抖音重复播放算次数吗(抖音重复播放会重复消耗流量吗)

  • qq视频最多几个人开摄像头(qq能放多少视频)

    qq视频最多几个人开摄像头(qq能放多少视频)

  • 网线不亮灯怎么回事(网线的灯不亮了)

    网线不亮灯怎么回事(网线的灯不亮了)

  • 一个宽带可以装几个路由器(一个宽带可以装3个路由器吗)

    一个宽带可以装几个路由器(一个宽带可以装3个路由器吗)

  • 华为p30智能遥控在哪(华为P30智能遥控)

    华为p30智能遥控在哪(华为P30智能遥控)

  • 手机限额后怎么转账(手机限额后怎么解决)

    手机限额后怎么转账(手机限额后怎么解决)

  • 饿了么骑手怎么加入(饿了么骑手怎么加入全职)

    饿了么骑手怎么加入(饿了么骑手怎么加入全职)

  • 华为stftl10什么型号(华为stfal10价格)

    华为stftl10什么型号(华为stfal10价格)

  • 酷狗音乐怎么上传到陌陌(酷狗音乐怎么上传自己的音乐作品?)

    酷狗音乐怎么上传到陌陌(酷狗音乐怎么上传自己的音乐作品?)

  • 怎么增加扣扣预设账号数量(qq怎么添加预设账号数量)

    怎么增加扣扣预设账号数量(qq怎么添加预设账号数量)

  • 抖音连麦怎么连(抖音连麦怎么连关注的人)

    抖音连麦怎么连(抖音连麦怎么连关注的人)

  • 华为电脑linux系统怎么下载软件(华为电脑 linux)

    华为电脑linux系统怎么下载软件(华为电脑 linux)

  • oppoa9充电灯在哪设置(oppoa9手机充电指示灯在哪里设置)

    oppoa9充电灯在哪设置(oppoa9手机充电指示灯在哪里设置)

  • iphone11运存多少(苹果11运存是多大)

    iphone11运存多少(苹果11运存是多大)

  • 苹果怎么设id(苹果怎么设ID密码)

    苹果怎么设id(苹果怎么设ID密码)

  • 显卡风扇转但是屏幕没反应(显卡风扇转但是显示器不亮)

    显卡风扇转但是屏幕没反应(显卡风扇转但是显示器不亮)

  • 【Vue】图片拉近、全屏背景实战经验总结(vue图片点击放大)

    【Vue】图片拉近、全屏背景实战经验总结(vue图片点击放大)

  • 计算机视觉OpenCV-图像直方图(计算机视觉opencv项目简单代码)

    计算机视觉OpenCV-图像直方图(计算机视觉opencv项目简单代码)

  • hostid命令  用来打印当前主机的数字化标识(hostnamectl命令)

    hostid命令 用来打印当前主机的数字化标识(hostnamectl命令)

  • 2022最新款带采集功能抖音壁纸小程序源码

    2022最新款带采集功能抖音壁纸小程序源码

  • 发票名称开错了但是税号没错怎么办
  • 消费税和所得税的关系
  • 应付账款支付时需要付款申请单吗
  • 外地预缴所得税的会计分录
  • 红冲的发票能不能取消
  • 自产产品用于广告要交消费税吗
  • 城建税计税依据扣除增值税期末留抵
  • 软件服务费280抵扣申报
  • 分公司独立核算企业所得税缴纳
  • 自然人独资企业交哪些税
  • 税务评估补税如何入账处理合适?
  • 退休人员返聘工资按工资薪金还是劳务报酬
  • 事业单位取得了应税收入如何纳税?
  • 药店的成本费用有哪些
  • 投资理财产品的风险性从低到高
  • 一般纳税人开具房屋租赁费税率
  • 免税品销售有增值税吗
  • 高新技术企业所得税税率
  • 本月只有红字发票该怎么申报小规模
  • 交强险是不是只要有发票就可以报销
  • 个体工商户开服务类型发票怎么开的
  • 烟花爆竹入库须知
  • bios设置的完整说法
  • 中介公司收取中介费过高违法吗
  • 个税是每个月累计纳税额吗
  • 几个人注册公司好还是个体户好
  • 外观专利的价值
  • php 抓取别的网站的内容
  • win10专业版0x803fa067
  • 公司贷款过桥费合法吗
  • 销售折让负数发票如何入账
  • PQV2ISECURITY.EXE - PQV2ISECURITY是什么进程 有什么用
  • 整理php防注入和注入
  • 长期债券投资业务处理
  • php调用其他php函数
  • 纳税人数字签名怎么填
  • javascript保留字有哪些
  • 【AI大比拼】文心一言 VS ChatGPT-4
  • cd播放模式
  • 所得税费用要结转损益吗
  • 农产品免税发票可以抵扣增值税吗
  • 民间非营利组织会计账务处理
  • python代码用什么运行
  • python3 静态方法
  • 其他资本公积可以冲减吗
  • datatable怎么用
  • SQLServer2005 Output子句获取刚插入的ID值
  • 盈余公积的提取条件
  • 不具有销售性质的工作
  • 怎么判断其他债权债务
  • 用留存收益筹资为什么没有占用费
  • 一般纳税人开红字专用发票流程
  • 坏账收回来了怎么处理
  • 航天信息税票
  • 增值税及附加是什么税
  • 进项税包含
  • 普通发票的开具办法是?
  • 新建厂房哪些费用可以计入
  • 融资租入固定资产属于本企业资产
  • win10小娜如何使用
  • macos怎么操作
  • appcrash是什么文件
  • linuxcp命令如何使用
  • win7删除搜索历史记录
  • win8系统设置
  • win10相机桌面快捷方式
  • xp电脑桌面图片显示缩略图
  • 如何解除系统默认
  • w1020h2更新失败
  • linux哪里好
  • virtualbox装linux
  • ping命令的基本使用方法
  • unity 加载界面
  • shell脚本位置变量
  • javascript要怎么学
  • javascript面向对象编程指南 pdf
  • windows安装程序安装在哪里
  • 残疾人就业保障金什么时候申报缴纳
  • 国税局发票查询平台发票查询
  • 涉密人员保密教育培训可以采取
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号