位置: 编程技术 - 正文

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

  • 政府补贴在企业怎么申请
  • 个人独资企业可以投资有限公司吗
  • 手续费及佣金收入
  • 财产租赁所得适用什么税率
  • 未开票收入已缴税额怎么入账
  • 小规模纳税人开专票税率是1%还是3%
  • 商场收取租户电费怎么处理税收?
  • 抹掉的零头怎么入账
  • 怎么根据进销存做账
  • 票据追索权向谁追索
  • 特朗普政府公布大力度减税方案
  • 公司必须购买税控设备吗
  • 成本类科目有哪四个
  • 固定资产投资增值税进项税额抵扣规定
  • 公司车过户给个人流程
  • 关于其他应收款账户的说法
  • 预付账款补付货款分录
  • win7系统中怎么找不到投影仪
  • 交增值税还交营业税吗
  • php字符串赋值
  • php array数组
  • linux root 命令
  • php封装接口
  • 事业单位接受捐赠固定资产入账
  • linix unix
  • 免税怎么开
  • vue3如何实现使用SortableJs插件进行表格内的数据项拖拽排序
  • 预提收入需不需要计提增值税
  • php设计原则
  • 税控盘维护费全额抵扣分录怎么做
  • 微信小程序开发一个多少钱
  • 前端将base64图片转换成file文件
  • 7z命令行详解
  • python怎么将整数转化为字符串
  • 职工福利费的范围有哪些
  • 租赁汽车折旧年限怎么算
  • 加油票没有纳税怎么办
  • 小规模纳税人采购需要发票吗
  • 个税手续费返还要交企业所得税吗
  • 资产负债表的累计折旧
  • 无形资产摊销是当月增加当月摊销吗
  • 所得税费用影响企业营业利润吗
  • MySQL提示The InnoDB feature is disabled需要开启InnoDB的解决方法
  • 社保和公积金个人和单位缴纳比例
  • 内账应收应付怎么对账
  • 金税盘未响应什么意思
  • 货运代理的公司
  • 处置子公司利润表怎么合并
  • 长期挂账其他应付款违反了哪项制度
  • 生产经营收入总额填什么金额
  • 固定资产清理时累计折旧提完了怎么账务处理
  • 辅助生产成本应计入什么
  • 新组建的公司该怎样开展工作
  • linux下apache、mysql、php安装配置详细笔记
  • mysql联合索引生效原则
  • MySQL exists 和in 详解及区别
  • Win10 Build 17035自制64位中国版十合一ISO镜像下载地址
  • winxp密码忘了
  • 商用计算机英文
  • windows2000server安装过程
  • 对Windows Server 2008系统自带的磁盘分区进行无损分区的教程图文介绍
  • windows 安装源
  • msng.exe是什么
  • windows7网络和internet设置
  • 怎么让微软账户获得所有权限
  • win10系统自定义设置
  • linux shell echo
  • java程序员准备骑驴找马了,需要怎么准备
  • jquery 引入js
  • python咋写
  • 页面滚动到底部
  • ja开发
  • NGUI简介
  • flask框架下使用scrapy框架
  • 税务谈心谈话记录2021
  • 企业年金可以补办吗
  • 房地产公司可以查到客户购房信息
  • 福州市税务局领导班子成员名单
  • 从国外网购东西回来要交税吗
  • 官方客服热线人工台电话
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设