Python单例模式

实现单例模式的三种方法:类实现、装饰器实现和元类实现

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

全栈程序员社区此处内容已经被作者隐藏,请输入验证码查看内容
验证码:
请关注本站微信公众号,回复“验证码”,获取验证码。在微信里搜索“全栈程序员社区”或者“www_javaforall_cn”或者微信扫描右侧二维码都可以关注本站微信公众号。

实现单例模式的三种方法:类实现、装饰器实现和元类实现

#coding-utf-8

#单例模式

#类的方式实现单例模式
'''class Singleton(object):

    _instance = None
    def __init__(self):
        print ("__init__")
        pass

    @staticmethod
    def __new__(cls, *argv, **kwargv):
       print ("__new__")
       if not cls._instance:
           cls._instance = super(Singleton, cls).__new__(cls,*argv, **kwargv)

       return cls._instance    

class A(Singleton):pass'''

#使用装饰器的方式实现单例模式
'''def Singleton(cls):
    instances = {}
    
    def getinstance(*argv, **kwargv):
        if cls not in instances:
            instances[cls] = cls(*argv, **kwargv)   
        return instances[cls]

    return getinstance

@Singleton
class A(object):
    def __init__(self, parm):
        print ("class A __init__:%s" %(parm))'''

#使用元类的方法实现单例模式
class Singleton(type):
    instances = {}
    def __call__(self, *argv, **kwargv):
        if self not in self.instances:
            print ("!!!not have instances")
            self.instances[self] = super(Singleton, self).__call__(*argv, **kwargv)
        return super(Singleton, self).__call__(*argv, **kwargv)    

    def __new__(mcs, name, bases, namespace, **kwargs):
        print ("Singleton new")
        return super(Singleton, mcs).__new__(mcs,name, bases, namespace, **kwargs)

class A(metaclass = Singleton):
    def __init__(self):
        self.aa = 1

if __name__ == "__main__":
    a = A()
    b = A()
    print (id(a))
    print (id(b))

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/120211.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Java并发学习之十九——线程同步工具之Phaser「建议收藏」

    Java并发学习之十九——线程同步工具之Phaser

    2022年2月5日
    39
  • 神经网络学习(十三)卷积神经网络的MATLAB实现

    神经网络学习(十三)卷积神经网络的MATLAB实现系列博客是博主学习神经网络中相关的笔记和一些个人理解,仅为作者记录笔记之用,不免有很多细节不对之处。卷积神经网络回顾上一节,我们简单探讨了卷积神经网络的反向传播算法,本节我们着手实现了一个简单的卷积神经网,在此之前先以最基本的批量随机梯度下降法+L2正则化对对卷积神经网络的反向传播算法做一个很简单回顾。需要确定参数有:小批量数据的大小mmmCNN模型的层数LLL和所有隐…

    2022年9月22日
    0
  • java urlencoder,java中的URLEncoder和URLDecoder类「建议收藏」

    java urlencoder,java中的URLEncoder和URLDecoder类「建议收藏」java中的URLEncoder和URLDecoder类URLEncoder类包含将字符串转换为application/x-www-form-urlencodedMIME格式的静态方法。为了解决web设计中不同操作系统间的差异性,我们在URL中使用的字符就必须是一个ASCII字符集的固定字集中的元素,具体如下:1.大写字母A-Z2.小写字母a-z3.数字0-94.标点符-_.!~…

    2022年6月26日
    36
  • 教你如何用Jenkins自动化部署项目(教程,从零到搭建完成)

    教你如何用Jenkins自动化部署项目(教程,从零到搭建完成)   最近在实习中接触了jenkins这个东西,所以花点时间了解了下。它可以在代码上传仓库(如github,gitee,gitlab)后,在jenkins(一个网站界面)中通过获取代码仓库中最新代码,进行自动化部署,而省去手动打包、上传服务器、部署这一系列步骤,非常方便。    下面教程分为以下几个部分:一、在你的本地电脑或者linux服务器上下载安装jenkins:jen…

    2022年5月5日
    446
  • idea运行缓慢_intellij idea运行不了

    idea运行缓慢_intellij idea运行不了一、设置jvm  1、由于默认的jvm太多,但是实际上可以用的比较少,我们可以这样进行设置,使用鼠标右键单击桌面上的IntelliJIDEA软件图标,选择“打开文件所在的位置”一栏  2、然后根据类型的排序,找到后缀为“vmoptions”的文件(注意和你的操作系统版本一致,32bit||64bit)  3、找到之后将他们打开,然后更改Xmx与Xms这…

    2022年9月3日
    2
  • jQuery鼠标悬停3d菜单展开动画

    效果体验:http://hovertree.com/texiao/jquery/93/竖直的主菜单贴着页面左侧,当光标移入菜单项时,以3D动画的方式弹出对应的二级菜单。采用jQuery和CSS3实现。

    2021年12月28日
    39

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号