位置: 编程技术 - 正文

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

  • 企业所得税汇算清缴退税怎么做账
  • 原始凭证如何粘贴到记账凭证后面
  • 借款利息抵扣土增
  • 无形资产升值怎么处理
  • 淘宝手续费是什么意思
  • 固定资产贷款偿还期计算公式
  • 房地产开发企业资质等级有几个
  • 长期股权投资稀释
  • 增值税普票遗失了怎么办
  • 发票作废税金怎么算
  • 租车服务的税率
  • 资本溢价公积金计算公式
  • 利润表里的营业税金及附加如何计算
  • 公允价值变动损益属于损益类的
  • 个税滞纳金如何调增所得税费用
  • 外商企业需要交企业所得税吗
  • 固定资产投资成本的回收与实物更新
  • 可变现净值是不是就是毛利
  • 劳务费的现金流量是什么
  • 销售商品包安装如何确认收入
  • 社会保险生育险能报多少
  • 银行的贷款损失准备会计分录
  • 住房公积金如何使用
  • 赠与合同要公证吗有效吗
  • 家里的无线网连着连着就断了
  • 销售使用过的固定资产怎么填申报表
  • 职工教育经费是不是教育费附加
  • 十大经典排序算法(动图演示C 实现)
  • 100多年前程序员
  • 固定资产被替换的账面价值怎么算
  • spring boot怎么学
  • 行政性收费和事业性收费 财政局
  • 关于存货跌价准备
  • 民营医院发票样式
  • 公司给员工交社保是怎么交的
  • 退役士兵抵税2019
  • 报销具体流程
  • 网上税则
  • phpvue开发模式
  • dedecms批量发文章
  • 织梦cms怎么样
  • macos装mysql
  • mysql5.7.27安装与配置
  • 进项税需要转出的分录
  • 电子商业汇票是指
  • 房屋出租收到的发票
  • 分派现金股利处理
  • 教育培训行业税目分类
  • 印花税的征税对象和计税依据
  • 会计中劳保用品是什么
  • 有进项税额转出,怎么计提附加税
  • 业务招待费专用会计科目
  • 防伪税控服务费全额抵扣申报表怎么填
  • 资产负债率计算方法公式
  • 期末损益类科目结转
  • 会计制度和会计准则科目转换
  • 计提工资与实发工资有差额怎么计算成本
  • 支票的使用流程图
  • 小微企业建账
  • 建账前的准备工作
  • linux下mysql的root密码忘记的解决方法
  • centos6.9开启ssh服务
  • win8触摸板失灵怎么办
  • mac ds_store
  • SUSE Linux Enterprise Server 设置防火墙开启ssh远程端口的方法
  • win7笔记本任务管理器
  • 如何解决windows资源管理器已停止工作
  • Metaio in Unity3d 教程--- 二. 创建自己的Application
  • linux命令shell脚本
  • shell切分
  • Python3.6 Schedule模块定时任务(实例讲解)
  • Node.js中的什么模块是用于处理文件和目录的
  • unity3d Human skin real time rendering plus 真实模拟人皮实时渲染 plus篇
  • javascript中函数的作用域分为全局作用域
  • h5实现微信分享
  • 餐饮办税
  • 2022年国家标准公文格式
  • 国家税务总局简易征收最新文件
  • 基层税务稽查具体内容
  • 办税服务厅是税收工作的
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设