位置: 编程技术 - 正文

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

  • 进项留抵转出会计分录
  • 已提折旧
  • 印花税的实质
  • 小规模减免税款的账务处理
  • 分派现金股利需要缴税吗
  • 税务规定先收款后开票,合同约定先收票再付款
  • 借贷必相等为什么是错的
  • 短期借款的主要形式
  • 银行打出的明细清单怎么看不懂
  • 税控服务费列入管理费用什么费用?
  • 销售退回的增值税怎么处理
  • 政府奖励企业款银行未收到会计分录
  • 发票已认证未抵扣怎么办
  • 发票对方认证不了怎么回事
  • 广告制作费可以计入印刷费吗
  • 个人非货币性资产出资 个人所得税
  • 合伙制公司有董事会吗
  • 会计累计折旧属于什么科目
  • 个体户地税怎么收费
  • 2017年个税税率表及个税计算公式
  • 并购重组协议样本
  • 物业公司收的电梯费如何做账
  • 少计提增值税0.01计入营业外
  • sbsetup.exe - sbsetup是什么进程 有什么用
  • php lee
  • 所得税贷款利息扣除
  • 普通发票丢了如何入账
  • vue报错cannot read property
  • 一借多贷的会计分录格式
  • php怎么取数组
  • Vision Transformer 模型详解
  • 股权收购印花税填哪里
  • 出口退税款的账务怎么做
  • web主要的请求方式有几种
  • linux中搭建web服务器
  • 缴纳税款滞纳金怎么算
  • mongodb使用场景 简书
  • 高新企业申请流程
  • sqlserver高版本数据库文件转低版本
  • 通过SQL Server 2008数据库复制实现数据库同步备份
  • sqlserver数据导入mysql
  • sql命令语句
  • 商业折扣影响主营业务成本吗
  • 培训费 会议费
  • 增值税普通发票查询
  • 水费差额缴税如何计算
  • 高新技术企业支付特许权使用费
  • 投资折价会计处理
  • 网上银行可以取款吗
  • 培训费开票属于劳务费吗
  • 样品定义是什么
  • 仲裁期间公司发工资了怎么办
  • 车辆转让怎么开票
  • 如何查看windows密钥
  • 腾讯云 阿里云 营收对比
  • 联想yoga升级win11
  • windows vista pe
  • 强化廉洁意识 筑牢思想防线
  • 笔记本上安装软件怎么弄
  • 开机一直提醒ctrl+alt+del
  • win10启动很慢怎么办
  • 如何提升windows版本
  • 怎么使用Win10自带绘画软件
  • win10raw预览
  • unityrpg
  • es6新增的数据结构
  • 制作网页需要
  • 只有一行的矩阵的逆矩阵
  • vue3目录解析
  • jquery动画让div旋转
  • android开源库
  • 手滑式手机是什么意思
  • javascript获取数据类型
  • 税务局着装规定文件
  • 未开票收入如何申报增值税
  • 数字证书使用方法
  • 北京市税务局的待遇怎么样
  • 小微企业减半征收房产税
  • 深圳龙华九价怎么预约
  • 翡翠是否交消费税
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设