zoukankan      html  css  js  c++  java
  • Python单例模式

    单例模式

      单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在,当希望在整个系统中,某一个类只能出现一个实例时,单例对象就能在这种场景派上用场.

    单例的实现方式一:使用classmethod

    IP = '10.1.68.13'
    PORT = 8080
    import settings
    class MySQL:
        __instance = None
    
        def __init__(self, ip, port):
            self.ip = ip
            self.port = port
    
        @classmethod
        def from_conf(cls):
            if cls.__instance is None:
                cls.__instance = cls(settings.IP, settings.PORT)
            return cls.__instance
    
    
    obj1 = MySQL.from_conf()
    obj2 = MySQL.from_conf()
    obj3 = MySQL.from_conf()
    obj4 = MySQL('10.1.68.13', 8080)
    print(obj1)
    print(obj2)
    print(obj3)
    print(obj4)

    单例的实现方式二:使用装饰器

    def singleton(cls):
        _instance = cls(settings.IP,settings.PORT)
        def wrapper(*args,**kwargs):
            if args or kwargs:
                instance = cls(*args,**kwargs)
                return instance
            return _instance
        return wrapper
    
    @singleton #MySQL = singlenton(MySQL)  MySQL = wrapper
    class MySQL:
        __instance = None
        def __init__(self, ip, port):
            self.ip = ip
            self.port = port
    
    obj1 = MySQL()
    obj2 = MySQL()
    obj3 = MySQL()
    print(obj1)
    print(obj2)
    print(obj3)

    单例的实现方式三:使用元类

    class Mymeta(type):
        def __init__(self, class_name, class_bases, class_dic):
            # self = MySQL这个类
            instance = self(settings.IP, settings.PORT)
            self.__instance = instance
    
        def __call__(self, *args, **kwargs):
            # self = MySQL这个类
            if args or kwargs:
                obj = self.__new__(self)
                self.__init__(obj, *args, **kwargs)
                return obj
            else:
                return self.__instance
    
    
    class MySQL(metaclass=Mymeta):  # MySQL = Mymeta(..)
        def __init__(self, ip, port):
            self.ip = ip
            self.port = port
    
    
    a = MySQL()
    b = MySQL()
    c = MySQL()
    d = MySQL('10.6.5.6', 8080)
    print(a)
    print(b)
    print(c)
    print(d)

    单例的实现方式四:使用模块

      python的模块就是天然的单例模式,因为模块在第一次导入时,就会执行一次,但是之后的导入都直会执行第一次导入的指向,因此,我们只需要把相关的函数和数据定义在一个模块中,就可以获得一个单例对象了

    def f1():
        from singleton import instance
        print(instance)
    
    def f2():
        from singleton import instance,MySQL
        print(instance)
        obj=MySQL('1.1.1.3',3302)
        print(obj)
    
    f1()
    f2()
    import settings
    
    class MySQL:
        print('run....')
        def __init__(self, ip, port):
            self.ip = ip
            self.port = port
    
    instance=MySQL(settings.IP,settings.PORT)

    单例的实现方式四:使用__new__

    class MySQL:
        __instance = None
    
        def __init__(self):
            pass
    
        def __new__(cls, *args, **kwargs):
            if cls.__instance == None:
                cls.__instance = super().__new__(cls)
            return cls.__instance
    obj1=MySQL()
    obj2=MySQL()
    obj3=MySQL()
    print(obj1)
    print(obj2)
    print(obj3)

     

  • 相关阅读:
    Fidder4 顶部提示 “The system proxy was changed,click to reenable fiddler capture”。
    redis 哨兵 sentinel master slave 连接建立过程
    虚拟点赞浏览功能的大数据量测试
    python基础练习题(题目 字母识词)
    python基础练习题(题目 回文数)
    python基础练习题(题目 递归求等差数列)
    python基础练习题(题目 递归输出)
    python基础练习题(题目 递归求阶乘)
    python基础练习题(题目 阶乘求和)
    python基础练习题(题目 斐波那契数列II)
  • 原文地址:https://www.cnblogs.com/louyefeng/p/9550749.html
Copyright © 2011-2022 走看看