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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • influxDb_ef mongodb

    influxDb_ef mongodbInfluxDB(时序数据库)(influx,流入,涌入),常用的一种使用场景:监控数据统计。每毫秒记录一下电脑内存的使用情况,然后就可以根据统计的数据,利用图形化界面(InfluxDBV1一般配合Grafana)制作内存使用情况的折线图;可以理解为按时间记录一些数据(常用的监控数据、埋点统计数据等),然后制作图表做统计;1、什么是InfluxDBInfluxDB是一个由InfluxDa…

    2025年8月7日
    3
  • 中缀表达式转后缀表达式的方法,步骤和原理及后缀表达式运算方式

    中缀表达式转后缀表达式的方法,步骤和原理及后缀表达式运算方式中缀转后缀本文大部分资料参考慕课何钦铭老师的数据结构相关的慕课链接:表达式求值中缀表达式是最常用的算术表达式,运算符在运算数中间,运算需要考虑运算符优先级.后缀表达式是计算机容易运算的表达式,运算符在运算数后面,从左到右进行运算,无需考虑优先级,运算呈线性结构.先举个简单的转换例子2+9/3-5(前缀)->293/+5-(后缀)先进行乘除再进行加减运算规律,…

    2022年6月16日
    28
  • Android游戏引擎_巨星引擎网络公司

    Android游戏引擎_巨星引擎网络公司学Android游戏开发的朋友,往往会显得有些无所适从,他们常常不知道该从何处入手,每当遇到自己无法解决的难题时,又往往会一边羡慕于iPhone下有诸如Cocos2d-iphone之类的免费游戏引擎可供使用,一边自暴自弃的抱怨Android平台游戏开发难度太高,又连个像样的游戏引擎也没有,甚至误以为使用Java语言开发游戏是一件费力不讨好且没有出路的事情。事实上,这种想法完全是没有必要且不

    2025年11月27日
    2
  • 写字板(Windows程序设计)

    写字板(Windows程序设计)前言c正编译生成debug,exe等文件,同样也可以通过exe"反编译"生成相对应的文件,一劳永逸,任君选择(`・ω・´)(~~我们老师为了给我们看要求效果给了

    2022年7月1日
    24
  • 数据库 之关系模型

    数据库 之关系模型关系模型的数据结构:以二维表的形式表示实体和实体之间联系的数据模型。其是一张规范化的二维表,它由表名,表头和表体三部分构成。2.关系模型:分量:每一行对应的列的属性值,即为元组中的一个属性值。候选码:可唯一标识一个元组的属性或属性集。3.关系模式:关系模式是对关系的描述,是关系模型的“型”,一般表示为:关系名(属性1,属性2,属性n)4.关系模型的数据操纵主要包括查询,插入,删除和修改。…

    2022年7月16日
    16
  • p90灯珠和p70灯珠区别_pc50是什么材料

    p90灯珠和p70灯珠区别_pc50是什么材料p50,p90,p99(或者写作pct50,pct90,pct99)都是数据聚合统计一种方式,跟百分比相关。p50:数据集按升序排列,第50分位置大的数据(即升序排列后排在50%位置的数据)。p90:数据集按升序排列,第90分位置大的数据(即升序排列后排在90%位置的数据)。p99:数据集按升序排列,第99分位置大的数据(即升序排列后排在99%位置的数据)。有什么实际含义和用处?经常用来衡量服务响应延迟。以最常用的p99为例,它衡量了99%的情况下能达到的最大延迟,99%的请求都低于

    2025年6月15日
    2

发表回复

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

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