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

  • 微信公众号文章的阅读量要如何提高?(微信公众号文章浏览记录)

    微信公众号文章的阅读量要如何提高?(微信公众号文章浏览记录)

  • vivo手机微信视频铃声怎么更换(vivo手机微信视频没有声音)

    vivo手机微信视频铃声怎么更换(vivo手机微信视频没有声音)

  • 苹果13自动亮度怎么设置(苹果13自动亮度调节需要关闭吗)

    苹果13自动亮度怎么设置(苹果13自动亮度调节需要关闭吗)

  • 苹果音频通话方式在哪(iphone通话音频)

    苹果音频通话方式在哪(iphone通话音频)

  • 窗口切换快捷键ctrl加什么(3dmax窗口切换快捷键)

    窗口切换快捷键ctrl加什么(3dmax窗口切换快捷键)

  • 穗康json数据格式不正确

    穗康json数据格式不正确

  • 华强北耳机和苹果耳机有啥区别(华强北耳机和苹果耳机正品区别大吗)

    华强北耳机和苹果耳机有啥区别(华强北耳机和苹果耳机正品区别大吗)

  • 苹果迷你2代平板多大尺寸(苹果迷你2代平板多少钱)

    苹果迷你2代平板多大尺寸(苹果迷你2代平板多少钱)

  • 华为手机电池能用几年(华为手机电池能用一天吗)

    华为手机电池能用几年(华为手机电池能用一天吗)

  • 微信黑名单里没有他怎么加不了(微信黑名单里没有删除选项怎么办?)

    微信黑名单里没有他怎么加不了(微信黑名单里没有删除选项怎么办?)

  • 小米手机动不动就间断性黑屏(小米手机动不动就重启是怎么回事)

    小米手机动不动就间断性黑屏(小米手机动不动就重启是怎么回事)

  • 抖音里漫画特效怎么弄(抖音里漫画特效怎么用不了)

    抖音里漫画特效怎么弄(抖音里漫画特效怎么用不了)

  • 微信电话声音断断续续(微信语音电话响铃断断续续)

    微信电话声音断断续续(微信语音电话响铃断断续续)

  • iphonex有4g无法上网(苹果x无法使用4g网络)

    iphonex有4g无法上网(苹果x无法使用4g网络)

  • 怎样下载火山小视频(怎样下载火山小视频呢 安装)

    怎样下载火山小视频(怎样下载火山小视频呢 安装)

  • qq附近50赞满了怎么办(qq附近点赞)

    qq附近50赞满了怎么办(qq附近点赞)

  • 无线话筒不响如何解决(无线话筒不发音怎么办)

    无线话筒不响如何解决(无线话筒不发音怎么办)

  • 怎么删除word中的所有标记(怎么删除word中的回车符号)

    怎么删除word中的所有标记(怎么删除word中的回车符号)

  • wps批量查找多姓名(wps批量查找姓名)

    wps批量查找多姓名(wps批量查找姓名)

  • wps如何设置脚注(wps如何设置脚注字体)

    wps如何设置脚注(wps如何设置脚注字体)

  • 手机迅雷下载的视频在哪里(手机迅雷下载的文件)

    手机迅雷下载的视频在哪里(手机迅雷下载的文件)

  • 手机怎样添加网络(手机怎样添加网络密码)

    手机怎样添加网络(手机怎样添加网络密码)

  • 手机云服务是什么意思(手机云服务什么时候才流行的)

    手机云服务是什么意思(手机云服务什么时候才流行的)

  • ipone应用与数据在哪里(苹果手机应用与数据选择什么)

    ipone应用与数据在哪里(苹果手机应用与数据选择什么)

  • 铅酸改锂电要注意(铅酸 改锂电)

    铅酸改锂电要注意(铅酸 改锂电)

  • 苹果记录日子的软件使用方法(苹果记录日子的软件自带)

    苹果记录日子的软件使用方法(苹果记录日子的软件自带)

  • win10初始化(win10初始化电脑)

    win10初始化(win10初始化电脑)

  • H5外部浏览器直接调起微信——通过url协议 weixin:// 判断是否安装微信及启动微信(支持h5浏览器)

    H5外部浏览器直接调起微信——通过url协议 weixin:// 判断是否安装微信及启动微信(支持h5浏览器)

  • 关于将tomcat卸载干净(如何将tomcat卸载干净)

    关于将tomcat卸载干净(如何将tomcat卸载干净)

  • vue系列(三)——手把手教你搭建一个vue3管理后台基础模板(vue系列教程)

    vue系列(三)——手把手教你搭建一个vue3管理后台基础模板(vue系列教程)

  • 发票丢失第一联盖章能用么
  • 培训费的其他费用是什么
  • 销售费用变动率税收政策
  • 税控技术维护费每年都能抵扣吗
  • 小规模自开专票怎么交税
  • 预算基数是什么
  • 基本医疗支付范围
  • 财产理赔收入怎么做账
  • 报销油费如何写摘要及会计分录怎么做?
  • 企业怎么申请无运输工具承运资质
  • 汽车租赁油费怎么算
  • 社保和公积金缴费基数怎么算
  • 保证金逾期退还
  • 主营业务税金及附加包括印花税吗
  • 金税盘用途
  • 企业一次性补助金是多少标准
  • 新公司领取营业执照后的流程
  • 电子承兑汇票支付信用查询
  • 营业外收入怎么申报
  • 图书对方开具的证明
  • 金蝶的币别和汇率怎么取消
  • 公司注销了是不是就不能用了
  • 控股子公司利润并表
  • 药店 医保收入占比
  • win10开机无限werfault一直刷新
  • vb win10
  • windows7iis安装
  • 银行初级证书全称
  • PHP:oci_lob_is_equal()的用法_Oracle函数
  • ati2mdxx.exe是什么进程 ati2mdxx进程信息查询
  • win 11怎么安装
  • 1050ti能玩绝地求生吗
  • 会计账簿的启用规则
  • php文本操作
  • zendframework3
  • css 单行显示
  • framework 开发
  • 反斜杠python
  • vue如何实现登录
  • 微信php开发包
  • php 微信公众号自定义菜单
  • 利息进项税是否含增值税
  • Switch Between Gnome And KDE Desktops In Ubuntu Or Kubuntu
  • 资产负债表季报是累计三个月数据吗
  • 原材料的对应账户有哪些
  • 国有企业投资程序
  • 营业执照丢失公告后几天可以办注销
  • 交强险还用开车去吗
  • 收到政府补贴现金流
  • 固定资产清理的累计折旧怎么算
  • 低值易耗品库存
  • 上月未记账
  • 公司转投资是什么意思
  • 现金支票存根联丢失怎么办
  • 银行存款的收付应严格执行()的规定
  • 公司被冻结
  • win8.1补丁包
  • 理解 成为 超越梗
  • fedora os
  • windows 安装源
  • ubuntu屏幕突然变大
  • centos5.4 安装
  • 超级简单的方法
  • Win7 SP1补丁32/64位 2015年1月汇总篇(内附下载)
  • windowsxp怎么打开设置
  • ubuntu安装配置静态ip地址
  • Mac系统中使用QuickTime Player实现屏幕录像图文教程
  • win10怎么看下载的软件
  • Windows下的C语言编译器
  • cocos2d-x教程
  • Extjs Label的 fieldLabel和html属性值对齐的方法
  • 教你学python
  • nodejss
  • 自定义圆角控件
  • apple开发
  • javascript 做网页
  • 河南商丘医疗保险在微信上怎么交
  • 小规模纳税人租金收入增值税税率
  • 水利基金要收滞纳金吗
  • 核定征收一般纳税人
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设