位置: 编程技术 - 正文

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

  • 个人所得税汇算清缴截止日期
  • 公司账户转私人账户要多久时间
  • 土建工程维修
  • 未达起征点销售额和小微企业免税销售额
  • 金蝶固定资产折旧怎么修改
  • 进项税加计扣除账务处理
  • 金蝶专业版怎么导入备份账套
  • 购买方已抵扣开具红字信息表之后做账需要什么原始凭证
  • 装饰设计事务所平面图
  • 专用发票上的码头堆存费等进项税可否抵扣?
  • 累计折旧的计提分录怎么写
  • 结存材料应分摊什么
  • 怎么确认外购存货成本?
  • 收取加盟费如何交税
  • 两所工资所得怎么扣税
  • 财务报表中预收账款的数据是怎么来的
  • 因台风造成原材料毁损计入什么科目
  • 资本公积可以只给一个股东转增资本
  • 增值税开票员的岗位职责
  • 员工福利费是否计入赔偿
  • 地下商铺出售产权归属
  • 纳税人证明是完税证明吗
  • 劳动生产总值计算公式.doc
  • 银行代扣社保怎么做会计分录
  • 交通费进项税抵扣计算
  • 房屋装修费是否分摊到地下车位成本
  • 收到汇票怎么承兑
  • 文件夹如何更改图标
  • 企业收到的罚款收入属于什么科目
  • 工会经费列支比例
  • linux怎么查找
  • 建筑公司收到工程款需要交哪些税
  • sethook.exe - sethook进程是什么文件 有何作用
  • php和ajax用哪个调用数据
  • 付款结算单范本
  • php的mysql_query
  • 普利特维采湖群国家公园天气
  • 去噪扩散概率模型
  • 陆家嘴金融贸易区管委会主任
  • 小规模纳税人低于30万怎么填报申报表
  • 蜈蚣什么情况下出现
  • js javascript
  • vue+echarts
  • tracet命令
  • discuz php版本
  • 勘察设计费是否含税
  • 水利基金忘记申报怎么查
  • 货币捐赠会计分录
  • 劳务公司社保手续办理
  • 预缴税款是什么意思
  • 车保险名称
  • 以前年度费用退回
  • 资产负债表所有者权益排列顺序
  • 收到退回的增值税,应当作为营业外收入核算对吗
  • 城市维护建设税的计税依据
  • 所得税弥补以前年度亏损什么意思
  • 保证金159001收益如何计算
  • 工程施工怎么结转,用友自动结转吗
  • 税率由16%变更为13怎么算
  • 其他应付款转营业外收入摘要怎么写
  • 收入红冲够是否红冲成本
  • 进口关税,增值税,消费税
  • 周转金怎么计算
  • 久期缺口计算公式解析
  • haozipsvc.exe是什么
  • 64位Windows XP系统盘空间占用很大空间怎么减肥
  • win8怎么设置
  • linux在云计算中的使用
  • node与js的区别
  • js if语句怎么写
  • 用bat调用exe并输入参数
  • nodejs fs.open
  • unity3d怎么让物体依次运动
  • Metaio in Unity3d 教学--- 二. 创建自己的Application
  • javascript运用
  • 脚本 python
  • 国家税务局申请电子发票怎么申请
  • 高级人民法院党组书记级别
  • 公司买的保险怎么查询保单明细
  • 内蒙古国家税务总局官网
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设