位置: 编程技术 - 正文

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

  • 自来水适用高税率吗
  • 银行存款出现负数算不算违规
  • 其他应付款不用付了会计分录
  • 增值税发票认证平台
  • 个体注销了名下的车辆
  • 离职补偿金怎么做账
  • 银行开户登记号在哪看
  • 甲供材能否开具增值税专用发票
  • 房产税计税依据含税还是不含税
  • 新建厂房房产证办理流程
  • 幼儿园幼儿买花的通知
  • 收回的材料赔偿款怎么处理?
  • 不属于抵扣范围的是什么
  • 拍卖的房产
  • 企业为员工购买的补充医疗保险
  • 增值税申报进项抵扣汇总表在哪里
  • 加计扣除的研发费用范围
  • 核定征收金额如何确定
  • 补偿金满一年不满一年半
  • 房地产开发企业取得的土地使用权用于建造
  • 研发阶段产品销售账务处理
  • 深入浅出stm8
  • 一般计税方法增值税
  • 跳线和短接
  • 失控发票的企业如何处理
  • 公司交会费有什么用
  • PHP:pg_lo_seek()的用法_PostgreSQL函数
  • 员工内部罚款有没有上限和下限
  • 野生动植物种源包括
  • 工业企业采购供应管理
  • php是面向对象语言吗
  • 工业企业制造费用占比
  • 农业经营许可证范围
  • php数据的提交与采集实验报告
  • node实战
  • 对公帐户进出帐要交税吗
  • ps怎么抠的干净
  • 预收账款发货
  • python的series
  • 珠宝首饰可以开发票吗
  • 使用权资产是什么意思
  • 好用的测试工具
  • 低值易耗品摊销计入什么科目
  • 收到发票怎么写摘要
  • 未确认融资费用含税吗
  • 基本账户的定义
  • 中标服务费如何赋码
  • 预付账款期末可能有余额吗
  • 股东捐赠给企业怎么做账
  • 工程项目立项前的安全评估
  • 计提工会经费如何做账
  • 营业税金及附加包括哪些
  • 外币投资计入什么科目
  • 交存超库存现金
  • 资产负债表和科目余额表怎么核对
  • 小规模公司怎样添加员工
  • 当月发票未到怎么做账
  • 固定资产折旧是什么意思
  • Vista下以真正的管理员登陆的设置方法
  • linux用
  • switcher.exe - switcher是什么进程
  • Linux一键安装ftp
  • linux怎么切到桌面
  • centos7网络配置文件在哪
  • Win10 Mobile 10586.63截图曝光:或为正式推送版本
  • 探索世界怎么玩
  • unity3d游戏引擎支持几种平台发布?
  • jquery制作图片提示效果
  • 什么是馥芮白
  • 网络自定义怎么打开
  • python怎么计数
  • unity android build support
  • android仿qq聊天
  • jquery实现表格隔行换色
  • 一些常用的网络命令
  • java教程 视
  • 安卓端测试
  • JavaScript isPrototypeOf和hasOwnProperty使用区别
  • 监察室主任岗位职责
  • 税务局社保服务
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设