位置: 编程技术 - 正文

详解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怎么更换版本
  • 筹建期的银行利息收入分录
  • php中??
  • 政府的奖励金计入哪个科目
  • PHP:pg_result_seek()的用法_PostgreSQL函数
  • php常用的设计模式在开发中的实例
  • 高新技术企业研发费用归集
  • hotkey osd driver可以卸载吗
  • 肚子胀气怎么办 4个方法快速排气很轻松
  • vue get方法
  • 收到转账怎么写分录
  • css教程网站
  • 持续ping ip的命令
  • 会引起所有者权益总额变动的是
  • 应收利息可以计入其他应收款吗
  • 预缴的企业所得税能抵扣企业所得额嘛
  • 帝国cms使用手册
  • 同一控制下企业合并
  • 酒店收入是什么收入
  • 研发费用加计扣除的条件
  • 房地产公司退房款怎么做账
  • 衍生工具属于什么科目
  • 企业房产税优惠政策2023
  • 残疾人就业保障金征收使用管理办法
  • 营业执照怎么办理注销
  • 装订好的凭证可以拿掉一页吗
  • acs_log是什么文件
  • centos6.5mini安装教程
  • bios设置从光驱启动优先,可是启动不了
  • window照片无法预览
  • win8.1系统安装教程
  • xp系统如何删除用户
  • macos邮件
  • linux环境什么意思
  • win8出现蓝屏怎么修复
  • LINUX下的磁盘编辑工具
  • windows11内测版
  • rpm软件安装命令
  • linux bzz
  • Cocos2d-x c++和java相互调用
  • cocos2dx官方教程
  • js中的call方法和apply方法
  • jquery的点击事件怎么写
  • Node.js中的什么模块是用于处理文件和目录的
  • python os.access
  • js模块化和组件化
  • cument.execCommand()用法深入理解
  • shell脚本-p
  • java 视频教程
  • webpack循环引用
  • android8.0特性
  • 增值税一般纳税人资格登记表
  • 广州电子税务局财务报表在哪里查询
  • 12366纳税服务热线
  • 上海市浦东新区公租房
  • 涉嫌虚开增值税专用发票罪
  • 资源税计税价格包括从坑口
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设