位置: 编程技术 - 正文

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

  • 向境外企业支付利息代扣代缴
  • 监控系统维护费计入什么科目
  • 商业承兑汇票贴现率
  • 会计哪些账本需要保存
  • 交通补贴补贴可以税前扣除吗?
  • 筹建期结转损益吗
  • 无偿受让股权的股东对发起股东没有出资承担责任
  • 出售自建厂房的税率
  • 营业执照印花税是什么意思啊
  • 设立独立核算的销售机构
  • 利润弥补以前年度亏损是税前吗
  • 出口申报时限
  • 如何填制记账凭证总结
  • 建筑投资包括哪些
  • 纳税能力体现的内容
  • 4s店帮买保险后会哪些资料要给我的
  • 软件开发怎么做会计分录
  • 如何给电脑文件加密并设置密码
  • 备用金冲销的会计分录
  • 消费税不可抵扣已纳税款
  • 托收账款属于什么会计科目
  • 秘鲁亚马逊木业有限公司招聘
  • php 缓存
  • 进口付汇流程
  • 小规模纳税人避税
  • 日落时分谭咏麟歌词
  • 短期借款产生的利息进入总账吗
  • php框架symfony
  • php str_split
  • 解决城市内涝的题目
  • 小程序项目开发流程
  • 微信小程序开发
  • css常见的选择器有哪几种
  • 如何进行合理的库存管理
  • 企业所得税资产总额根据什么填
  • 对企业采取以旧换新方式销售的应税产品
  • 股东退股怎么入账
  • linux服务器环境搭建
  • 织梦模板安装详细教程
  • 长期待摊费用的最新账务处理
  • 增值税发票的规范
  • access调用sql
  • 控股公司的收入怎么计算
  • 数据库系统中,用户通过什么访问数据
  • 企业取得投资收益要交税吗
  • 增值税普通发票和电子普通发票的区别
  • 公司购烟酒怎么入账
  • 工程施工的间接费用年底可以不结转吗
  • 收到季度房租需要分摊吗
  • 现金短缺与溢余解析
  • 查补以前年度增值税怎么申报
  • 应付职工薪酬代扣社保
  • 建筑业收入叫什么
  • 上年的原材料发票可以算今年的成本吗
  • 暂估固定资产的账务处理
  • 银行的现金解款需要多久
  • 品牌代理费计入什么科目
  • 应付职工薪酬的会计科目
  • 独立法人资格是独立核算
  • 新公司建立 需要先做哪行
  • mysql批量修改字段值
  • Microsoft SQLServer的版本区别及选择
  • sql如何随机抽样
  • sql数据库检查命令
  • Win7系统如何清除流氓屏保
  • win8打开桌面
  • windowsxp如何清理磁盘
  • 电脑周边是什么
  • imac 5k屏幕参数
  • win8开机启动项
  • nodejs异步处理执行顺序
  • android layer
  • android自定义viewgroup绘制
  • 常规巡察和专项巡察相结合
  • 一般纳税人开票的税率是多少
  • 无锡地铁时速多少公里
  • 广东省地方税务局历任局长
  • 出口汇率以什么为准
  • 汽车维修费税率是13还是6
  • 增值税发票如何红冲
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设