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

  • 苹果手机apn怎么设置(苹果手机apn怎么打开)

    苹果手机apn怎么设置(苹果手机apn怎么打开)

  • 华为同一个手机怎么登录两个微信(华为同一个手机上怎么安装两个微信软件)

    华为同一个手机怎么登录两个微信(华为同一个手机上怎么安装两个微信软件)

  • 微信举报封号多久可以解封(微信举报封号多久)

    微信举报封号多久可以解封(微信举报封号多久)

  • 苹果mwn是什么版本(苹果型号mw是什么版本)

    苹果mwn是什么版本(苹果型号mw是什么版本)

  • 冷屏和暖屏怎么区分(冷屏和暖屏哪个清晰度好)

    冷屏和暖屏怎么区分(冷屏和暖屏哪个清晰度好)

  • 手机号码多久没用就成空号了了(手机号码多久没用会变成空号)

    手机号码多久没用就成空号了了(手机号码多久没用会变成空号)

  • wan口未插线怎么回事(wan口未插网线但是wan灯是亮的)

    wan口未插线怎么回事(wan口未插网线但是wan灯是亮的)

  • 苹果8plus内存有128吗(苹果8plus的内存)

    苹果8plus内存有128吗(苹果8plus的内存)

  • 荣耀8x录屏在哪(荣耀8x录屏在哪里打开)

    荣耀8x录屏在哪(荣耀8x录屏在哪里打开)

  • 拨打的电话已关机是什么意思(拨打的电话已关机或者无法接通)

    拨打的电话已关机是什么意思(拨打的电话已关机或者无法接通)

  • 删除的qq动态怎么恢复(删除qq动态怎么删)

    删除的qq动态怎么恢复(删除qq动态怎么删)

  • iphone11promax可以用5G吗(iphone11promax可以用20w快充吗)

    iphone11promax可以用5G吗(iphone11promax可以用20w快充吗)

  • 安卓插口有几种(安卓插口有几种类型)

    安卓插口有几种(安卓插口有几种类型)

  • 远程特惠是什么意思(远程特惠是啥)

    远程特惠是什么意思(远程特惠是啥)

  • 小米的小爱同学有什么功能(小米的小爱同学在哪里设置)

    小米的小爱同学有什么功能(小米的小爱同学在哪里设置)

  • vivo怎么限制流量使用(vivo怎么限制流量)

    vivo怎么限制流量使用(vivo怎么限制流量)

  • vivo手机nnbs是什么(vivo手机nfc是什么意思)

    vivo手机nnbs是什么(vivo手机nfc是什么意思)

  • 抖音直播如何播放电影(抖音直播如何播放录制好的视频)

    抖音直播如何播放电影(抖音直播如何播放录制好的视频)

  • 苹果8如何竖屏转横屏(苹果8如何竖屏锁定)

    苹果8如何竖屏转横屏(苹果8如何竖屏锁定)

  • win10怎么分盘(win10怎么分盘分配空间)

    win10怎么分盘(win10怎么分盘分配空间)

  • 苹果无线耳机敲击设置(苹果无线耳机敲击正确部位)

    苹果无线耳机敲击设置(苹果无线耳机敲击正确部位)

  • 华为sea一al00是什么型号(华为sea一一al00)

    华为sea一al00是什么型号(华为sea一一al00)

  • 支付宝账户是什么意思(支付官网登录首页)

    支付宝账户是什么意思(支付官网登录首页)

  • 荣耀20pro屏多大(华为荣耀20pro屏幕多少寸)

    荣耀20pro屏多大(华为荣耀20pro屏幕多少寸)

  • 小米note3nfc功能在哪儿打开(小米手机note3nfc功能怎么用)

    小米note3nfc功能在哪儿打开(小米手机note3nfc功能怎么用)

  • 华为p30pro怎么关闭后台运行(华为p30pro怎么关闭步数显示)

    华为p30pro怎么关闭后台运行(华为p30pro怎么关闭步数显示)

  • java非访问控制修饰符有哪些(java 访问者模式)

    java非访问控制修饰符有哪些(java 访问者模式)

  • 外籍人士如何在中国办理延长签证
  • 进料加工要交税吗
  • 地产企业预缴增值税政策
  • 职业年金单位缴费方式
  • 车险 保险金额
  • 税收优惠抵扣
  • 长期待摊费用可以转入固定资产吗
  • 存货跌价准备计提原则
  • 音乐茶座取什么名字好呢
  • 外商独资和中外合资的区别
  • 核定征收可以享受小微企业税收优惠吗
  • 二手车销售挣钱不
  • 事业单位职工福利费计提标准和使用
  • 所得税退税未办理可以注销吗?
  • 纳税申报表如何导出
  • 税控盘费用抵减增值税
  • 农副产品税率及范围
  • 待认证税额是几级科目
  • 其它综合收益算利润吗
  • win11资源管理器卡死
  • 报废汽车残值收入的商品编码编码
  • vantUI van-picker中的column使用,picker选择器展示对象数组里面的属性,自定义展示数据
  • bc2.exe
  • 选择简易计税方法计税的有
  • 建筑工程开税票比例占到合同金额的多少
  • 汽车购置税计算公式
  • 购入固定资产款项已付
  • 固定资产折旧需要减去减值准备吗
  • cjzc框架
  • ai数字绘画设计培训
  • 前端基础知识总结
  • yolov3输出是什么
  • 增值税纳税申报表在哪里查询
  • 所得税汇算清缴报告在哪查
  • 金税盘如何读入新购电子发票?
  • 信用减值损失的借贷方向
  • 城建税减免性质代码是什么意思
  • 税控盘上月未清卡去税务带什么
  • 城建税的减免规定有哪些
  • 法人股东的分红怎么算
  • 应付账款多好还是少好
  • 生产车间为生产产品
  • 出口的进项发票认证后要确认吗
  • 一年的系统服务费多少钱
  • 小规模纳税人收入不能超过多少
  • 个人所得税个人申报和公司申报区别
  • 生产经营所得成本费用怎么算
  • 增值税是否计入税金及附加
  • 外资房地产企业 利润汇出比例
  • 公司私营企业
  • ado connection open.vi
  • sql server数据库怎么导出
  • 阿拉伯数字转大写函数
  • 行转列sql函数
  • 删除表s
  • Windows下System Volume Information文件夹是干嘛用的?
  • 升级win8.1 64位系统后无法玩剑灵怎么办?win8.1系统无法玩剑灵的解决方法
  • windows service 2003
  • 两台苹果怎么用电脑把数据同步
  • 丢失acui16.dll
  • ubuntu20.0安装
  • thinkpad 8高配版
  • 用于播放html5视频文件的正确
  • android 自定义
  • div css table
  • css如何把图片重叠在一起
  • 如何给图像应用css滤镜处理效果
  • jquery代码实现鼠标点击
  • npm 发布组件
  • 浅谈自己对教育的理解
  • pythone爬虫
  • unity每帧调用
  • json读取字符串
  • 刮刮奖软件下载
  • python发送信息到微信
  • 广东省电子税务局登录方式
  • 公司注册后多久要去税务局登记
  • 人文考试多少分合格
  • 印花税核算有两种情况,是如何处理的?
  • 出版社税费多少
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设