位置: 编程技术 - 正文

详解python单例模式与metaclass(python单子)

编辑:rootadmin

推荐整理分享详解python单例模式与metaclass(python单子),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:单例 python,编写单例模式,编程实现单例模式,python单子,py单例模式,编写单例模式,py单例模式,python单子,内容如对您有帮助,希望把文章链接给更多的朋友!

单例模式的实现方式

将类实例绑定到类变量上

但是子类在继承后可以重写__new__以失去单例特性

使用装饰器实现

问题是这样装饰以后返回的不是类而是函数,当然你可以singleton里定义一个类来解决问题,但这样就显得很麻烦了

使用__metaclass__,这个方式最推荐

metaclass

详解python单例模式与metaclass(python单子)

元类就是用来创建类的东西,可以简单把元类称为“类工厂”,类是元类的实例。type就是Python的内建元类,type也是自己的元类,任何一个类

python在创建类MyClass的过程中,会在类的定义中寻找__metaclass__,如果存在则用其创建类MyClass,否则使用内建的type来创建类。对于类有继承的情况,如果当前类没有找到,会继续在父类中寻找__metaclass__,直到所有父类中都没有找到才使用type创建类。如果模块里有__metaclass__的全局变量的话,其中的类都将以其为元类,亲自试了,没这个作用,无任何影响

查看type的定义,

type(object) -> the object's typetype(name, bases, dict) -> a new type

所以利用type定义一个类的元类,可以用函数返回一个上面第二种定义的对象,也可以继承type并重写其中的方法。

直接使用type生成的对象作为元类,函数作用是使属性变为大写

上一节中,单例模式元类实现用的是类继承方式,而对于第一种__new__的方式,本质上调用的是type.__new__,不过使用super能使继承更清晰一些并避免一些问题

这里简单说明一下,__new__是在__init__前调用的方法,会创建对象并返回,而__init__则是用传入的参数将对象初始化。看一下type中这两者以及__call__的实现

前面提到类相当于元类的实例化,再联系创建单例模式时使用的函数,用的是__call__,其实用三种magic method中任何一种都是可以的,来看一下使用元类时各方法的调用情况

结果

元类的__init__和__new__只在创建类Foo调用了一次,而创建Foo的实例时,每次都会调用元类的__call__方法

标签: python单子

本文链接地址:https://www.jiuchutong.com/biancheng/381270.html 转载请保留说明!

上一篇:Python工程师面试题 与Python Web相关

下一篇:python实现发送和获取手机短信验证码(python如何发送http请求)

  • 金税四期税务机关一局式
  • 销售货物提供运输是否分别核酸的例题
  • 会计做账能否使用复印件做账
  • 发票隔月作废怎么操作
  • 出借包装物收取的押金
  • 医院固定资产折旧率是多少
  • 去年开的专票今年可以作废吗
  • 跨区域经营企业
  • 增值税专票怎么抵扣
  • 出售闲置的材料物资
  • 一般纳税人怎么转小规模
  • 公司分期付款买车可以抵税吗
  • 无形资产摊销的年限规定
  • 劳动合同解除和终止的经济补偿
  • 进口关税专用缴款书怎么做分录
  • 建筑劳务公司派遣人员工资发放凭证
  • 营改增后发票上必须要开具税收分类编码吗?
  • 预收房租款如何入账
  • 关于财产保险公司的论文
  • 库存商品的账面余额是什么意思
  • 销售不动产差额征收增值税
  • 超市的商品进销表怎么做
  • 收到公司投入的土地使用权
  • 交易性金融资产的账务处理
  • 平均应收账款金额
  • 补提以前年度费用在年度报表中怎么填
  • 个人接受捐赠要开发票吗
  • 华为正式发布鸿蒙官网
  • 什么时候可以购买火车票
  • 推广费开票属于什么费用
  • html前端技术
  • php打开文件读取内容
  • 房产契税什么时间缴纳
  • 劳动法律法规包含哪些
  • 债权转让抵押权一并转让,需要办理抵押变更手续
  • 企业所得税季初数怎么填
  • vue2转vue3工具
  • 树枝上停着一只什么小鸟
  • 资产负债表申报怎么填
  • 公司购垃圾袋怎么做账
  • vue-router + element-plus实现面包屑导航栏和路由标签栏
  • resize2fs命令 同步文件系统容量到内核
  • js继承方式及其优缺点
  • 应交税费未交增值税
  • 货物入库会计分录怎么做
  • 用vue做的企业项目
  • 发票验旧有时间规定吗
  • 发行的企业债券属于所有者权益吗
  • 金蝶迷你版年结账套
  • mysql中的索引有
  • sqlplus分页查询
  • 什么情况下增值税进项税额转出
  • 公司支付宝账户怎么管理
  • 费用支出要求
  • 母公司给子公司注资要交印花税吗
  • 国际快递运输服务有哪些
  • 购进材料款项未付用什么凭证
  • 单式记账法因为其简单易学,记账效率高
  • 会计处理的步骤
  • 非营利性代收代缴税款
  • 固定资产多少钱标准
  • 总分类账户与明细分类账户是对账户按照其
  • 代扣代缴的增值税为什么可以抵扣
  • 采购付款的会计控制内容有哪些
  • openssl安装教程
  • usbmonit.exe - usbmonit是什么进程
  • 怎么改windowsxp版本
  • Mac Chrome打开HTTPS证书错误问题解决方法
  • emule.td文件怎么打开
  • win7诊断策略服务未运行是电脑问题还是网络
  • 根据显示的图的照片吊坠
  • ubuntu20.04安装samba
  • javascript屏蔽元素
  • shell 字符串trim
  • pythonmatch函数
  • jquery用什么编写
  • Android使用HttpURLConnection和HttpClient请求服务器数据
  • python简要介绍
  • 河北手工发票查验平台
  • 辽宁房产税2021年新规定来了,自2021年1月28日起执行
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设