这个模式,我还是了解的。

书上用了三种不同的方法。

class Singleton1:
    # 单例实现方式1
    __instance = None
    __is_first_init = False

    def __new__(cls, name):
        if not cls.__instance:
            Singleton1.__instance = super().__new__(cls)
        return cls.__instance

    def __init__(self, name):
        if not self.__is_first_init:
            self.__name = name
        self.__is_first_init = True

    def get_name(self):
        return self.__name

tony = Singleton1('Tony')
karry = Singleton1('karry')
print(tony.get_name(), karry.get_name())
print(id(tony), id(karry))
print(tony == karry)
print("=======单例实现方式1========")

class Singleton2(type):
    # 单例实现方式2
    def __init__(cls, what, bases=None, dict=None):
        super().__init__(what, bases, dict)
        cls._instance = None

    def __call__(cls, *args, **kwargs):
        if cls._instance is None:
            cls._instance = super().__call__(*args, **kwargs)
        return cls._instance

class CustomClass(metaclass=Singleton2):
    def __init__(self, name):
        self.__name = name

    def get_name(self):
        return self.__name

tony = CustomClass('Tony')
karry = CustomClass('karry')
print(tony.get_name(), karry.get_name())
print(id(tony), id(karry))
print(tony == karry)
print("=======单例实现方式2========")

def singleton_decorator(cls, *args, **kwargs):
    instance = {}

    def wrapper_singleton(*args, **kwargs):
        if cls not in instance:
            instance[cls] = cls(*args, **kwargs)
        return instance[cls]

    return wrapper_singleton

@singleton_decorator
class Singleton3:
    # 单例实现方式2
    def __init__(self, name):
        self.__name = name

    def get_name(self):
        return self.__name

tony = Singleton3('Tony')
karry = Singleton3('karry')
print(tony.get_name(), karry.get_name())
print(id(tony), id(karry))
print(tony == karry)
print("=======单例实现方式3========")
C:\Python36\python.exe C:/Users/Sahara/PycharmProjects/test1/test.py
Tony Tony
39257648 39257648
True
=======单例实现方式1========
Tony Tony
39257984 39257984
True
=======单例实现方式2========
Tony Tony
39257928 39257928
True
=======单例实现方式3========

Process finished with exit code 0

最新文章

  1. C# Winform 拦截关闭按钮触发的事件
  2. (转)Java中使用Jedis操作Redis
  3. Struts2(五):ActionSupport
  4. css页面点击文字出现蓝色底色去掉方法
  5. linux:lnmp环境搭建
  6. Tomcat的测试页打开空白页的解决方法
  7. 内网能PING通TELNET通不能访问解决
  8. 自适应SimpsonSimpson积分
  9. 基于Jmeter的轻量级接口压力测试(一)
  10. Mysql 根据时间戳按年月日分组统计
  11. java设计模式—多工厂模式
  12. [Apio2009][bzoj1179]Atm
  13. jmap -histo pid 输出的[C [B [I [S methodKlass constantPoolKlass含义
  14. BZOJ3240 [Noi2013]矩阵游戏 矩阵 快速幂 卡常
  15. java相对路径、绝对路径及类路径
  16. SDWebImage之SDWebImageCompat
  17. Hadoop如何将TB级大文件的上传性能优化上百倍?
  18. 测试--错误java.lang.Exception: No tests found matching [{ExactMatcher:fDisplayName=select], {ExactMatcher:fDisplayName=select(com.rjj.demo.DemoApplicationTests)]...
  19. javaScript高级教程(四) 复制对象
  20. elasticsearch中 refresh 和flush区别

热门文章

  1. 【CF981F】Round Marriage(二分答案,hall定理)
  2. c# 第35节 类的多态
  3. RSTP基本配置
  4. java加密类
  5. JDOJ1178:铺地板II
  6. 【LOJ2838】「JOISC 2018 Day 3」比太郎的聚会(设阈值预处理/分块)
  7. 记录错误or日记(更新中)
  8. mysql用户与权限操作
  9. 应用层内存溢出/越界/重复释放等问题检查工具(ASan)
  10. python中easydict的简单使用