位置: 编程技术 - 正文

详解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请求)

  • 不通过税金及附加的科目
  • 合伙企业税务筹划点
  • 所得税费用影响净利润吗
  • 光盘税收分类编码是多少
  • 横幅属于什么发票范围
  • 12月费用1月报销的账务处理
  • 国税地税合并后叫什么名称
  • 如何根据资产负债表填写现金流量表
  • 2019年印花税税率多少
  • 红字发票已抵扣和未抵扣是什么意思
  • 冲减管理费用是红字还是在贷方
  • 工程预付款增值税缴纳办法
  • 产品保修发生的维修费计入什么科目
  • 无形资产出租后还要摊销吗
  • 普通发票打歪了可以用吗
  • 小企业做了税务登记流程
  • 2017年8月1日到现在多少天
  • 初级会计职称考试时间
  • 公司注销了质保金如何收回来
  • 减免的附加税要计税吗
  • 滴滴发票开公司名称可以抵扣进项吗
  • 银行存款日记账怎么记账
  • 进项税和销项税怎么理解
  • 会计的运费怎么写分录
  • 计提待摊费用怎么记账
  • 纳税申报怎么做
  • 历史时间线怎么写
  • 商标申报费用会退回来吗
  • amdr5 1400
  • 招投标公司需要什么条件
  • 固定资产更新改造支出资本化
  • 记账凭证的编制方法有几种
  • 二级资本债记哪个科目
  • php中使用什么关键字定义常量
  • 金银首饰消费税计税依据
  • 因质量问题免费赔偿
  • but all failed
  • Python Module — OpenAI ChatGPT API
  • javaweb重点知识总结
  • 存货采购成本有余额吗
  • 发票勾选平台进入后没有什么内容
  • 逐帧flash动画
  • 如何查询上年企业所得税
  • 金蝶财务软件系统要求
  • python tkinter entry用法
  • 数据库帮助文档
  • 经典帝国cms生成器下载
  • 运费和什么有关
  • 新公司开基本户需要带什么材料
  • 排污收费制度在排污费征收方面存在的问题
  • 股票价值和内部收益率的公式
  • 企业对公帐户怎么转出私人帐户
  • 个税申报哪些可以减免
  • 小规模不开票怎么做账
  • 月报表该怎么做表格
  • 固定资产计提折旧的原则
  • 出口报关金额怎么算
  • 税费改革的思路
  • 应付职工薪酬工作流程
  • 工程款发票开给委托方要如何处理?
  • 投入产出比的计算依据
  • mysql5.5忘记密码
  • Windows Server 2008如何设置自动获取ip?设置自动获取ip教程
  • 苹果mac无法连接网络
  • win8.1设备管理器设置步骤
  • win10更新后有线网络无法使用
  • 批量win10激活码怎么弄
  • opengl详解
  • jquery中获取元素里边内容用什么方法
  • Windows环境下搭建Python开发环境的方法
  • unity点击按钮没反应
  • 简介怎么写
  • jquery滑动效果
  • android 自定义dialog
  • android如何导入v4包
  • js怎么拿到表单提交数据
  • 安徽省地方税务局刘利庆
  • 交管123发票审核
  • 重庆税务总局发票查询
  • 税务局的局长是什么级别
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设