位置: 编程技术 - 正文

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

  • 消费税是什么意思大白话
  • 一般纳税人申报纳税的流程
  • 递延所得税资产和负债怎么计算
  • 股权转让个人所得税如何计算
  • 累计折旧科目一直有余额吗
  • 汇算清缴企业所得税弥补亏损明细表怎么填
  • 其他应收款如何清理
  • 小汽车的增值税怎么算
  • 财务报表提示未审计
  • 房产租赁合同印花税
  • 租赁设备出口怎么处理?
  • 银行期初数不对,怎么调整
  • 应付企业负担的职工社会保险费
  • 别人垫付的医药费,可以报销吗
  • 材料盘亏可收回成本吗
  • 收到的专票都必须开吗
  • 赞助失败案例
  • 其他综合收益是什么类科目
  • 辅助生产成本科目月末有余额吗
  • 政府会计制度事业单位会计制度
  • 出口退税企业分类
  • 公司扣了员工的个人所得税但没有帮员工申报
  • 预交土增税税率
  • win10电脑如何设置锁屏时间
  • 宽带连接错误678最简单的解决方法
  • 苹果桌面小工具怎么设置
  • 文化事业建设费减免政策
  • 在windows7操作具有
  • php字符串函数有哪些
  • 重楼的功效与作用价格
  • 深入php:面向对象、模式与实践
  • php 生成随机字符串
  • 享受所得税优惠情况说明
  • 自然人股东是
  • php如何使用
  • vue中的provide/inject
  • but all failed
  • 长期待摊费用的摊销方法
  • rsync连接
  • 金融机构存放的保证金存款
  • 帝国cms导航站模板
  • 招待费进项转出填表二哪里
  • 外贸退税是算利率吗
  • mongodb基础知识
  • 往年补录情况
  • 企业收到财政拨付的专项资金账务处理
  • 固定资产折旧费计入成本吗
  • 利润表调整了资产负债表怎么调整
  • 汇兑损益应计入
  • 主营业务成本是借增贷减吗
  • 个体的个人所得税怎么交税?
  • 应缴财政专户款年末有余额吗
  • 计提的坏账应该计入哪个科目
  • 贷款减值准备是什么意思
  • 赠品当商品卖
  • 计划成本下
  • 应交税费会计分录实例分析
  • 不动产经营租赁属于什么服务
  • 未分配利润太大了怎么处理
  • UNIX系统中文件的索引表结构
  • 怎么建立dhcp服务器
  • ssh -i命令
  • cosplay步骤
  • ubuntu系统应用
  • mac os 切换
  • linux安装fping
  • win7系统安装软件权限设置
  • red hat linux怎么用
  • virtualbox怎么打开虚拟机
  • cocos2dx游戏开发框架
  • [置顶] 纯享版奥义,手机迅雷搜:阿天动漫
  • javascript对象的属性和方法
  • unity资源管理机制
  • vb中chr$(13)是什么意思
  • python中的命名规范
  • jquery简单例子
  • js文件保存
  • 办完营业执照多久可以开抖音小店
  • 云办税大厅
  • 海淀区地税局电话
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设