位置: 编程技术 - 正文

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

  • 营改增后房地产会计账务处理
  • 长期未付款
  • 个人所得税怎么扣除标准
  • 销售成本结转属于收入吗
  • 简易征收的收入包括哪些
  • 树苗应计入什么科目里面
  • 金税盘技术维护费账务处理
  • 投标函中的其他是指什么
  • 随意变更会计处理方法违背了
  • 留抵进项税额
  • 企业发生的辞退福利
  • 购进材料无发票会计分录
  • 应收账款贷方余额怎么处理
  • 购买股票如果公司亏损
  • 企业购入旧固定资产如何计提折旧
  • 企业可根据实际情况随意设置会计科目
  • 以前年度损益调整属于哪类科目
  • 农产品收购发票上的买价含税吗
  • 公司一直零报税,有问题吗
  • 工会经费怎么做账务处理
  • 作价入股的土地可以摊销无形资产吗
  • 季度不超过30万免税分录
  • 土地使用税的免征政策
  • 企业已确认销售收入的售出商品发生销售折让,且不属于
  • 怎么清除更新记录
  • 深度操作系统的窗口管理器
  • 如何进行网速测试设置
  • 没有系统U盘,电脑密码忘记了如何打开电脑
  • 360tray.exe损坏文件怎么修复
  • php使用while循环计算1到100的和
  • ipados15什么时候发布
  • 小规模纳税人税控设备可以抵扣吗设备
  • 资产处置损益要写明细账吗
  • 公司内部往来双向挂账
  • vue组件封装步骤
  • 华为od测试岗机试需要怎么准备
  • 微信小程序用电脑怎么打开
  • 贪吃蛇python小白
  • 投标保证金属于什么费用
  • python tkinter ttk
  • 房东减免后二房东不减房租
  • Centos安装ntfs-3g
  • 受托方代扣代缴增值税、消费税的纳税人
  • 怎样备份mysql数据库
  • 写字楼租金
  • 税控服务费减免月底怎样结转
  • 进项税准予抵扣条件有哪些
  • 进项税额不允许抵扣
  • 员工出差报销补贴政策
  • 应付账款清账账务处理
  • 支付补偿款计入什么会计科目
  • 其他应付款转应付账款分录
  • 企业购买的原材料确认为资产,这属于会计确认的范畴
  • 餐费补贴是否计入成本
  • 行政事业单位计提工资怎么做账
  • 什么发票可以抵扣税
  • 工程担保属于什么
  • 会计 预提
  • mysql提高效率
  • mysql中函数创建与调用示例
  • 如何设计高效合理的未来课程
  • centos 7安装教程
  • redhat网卡配置文件
  • windows server 2012将计算机图标添加到桌面(图文教程)
  • win8系统启动不了如何修复
  • mac文件怎么用
  • 双系统其中一个系统无法开机
  • windows8音频服务尚未启用 怎么解决
  • android图形系统
  • android开发环境的搭建步骤
  • python编程判断一千以内含88的数的方法
  • js网页自动化
  • ndk dose not contain any platform
  • python设计gui
  • javascript怎么弄
  • Activity的四种加载模式
  • python django 项目框架图
  • 贵州网上办税服务厅登录
  • 税务局科员是什么职业
  • 航天金税怎么导入发票
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设