zoukankan      html  css  js  c++  java
  • python中单例模式的四种实现方式

    配置文件settings.py

    IP='100.0.0.2'
    PORT=3302

    方式一:绑定给类的方法

    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()
    obj = Mysql('1.1.1.0', 3302)
    print(obj)
    print(obj1)
    print(obj2)
    print(obj3)

    方式二:装饰器

    def singleton(cls):
        # 先造好一个空对象
        instance = cls(settings.IP, settings.PORT)
    
        def wrapper(*args, **kwargs):
            if args or kwargs:  # args 和 kwargs 有值时,返回obj
                obj = cls(*args, **kwargs)
                return obj
            return instance
    
        return wrapper
    
    
    @singleton
    class Mysql:    # Mysql = singleton(Mysql)
        def __init__(self, ip, port):
            self.ip = ip
            self.port = port
    
    
    obj1 = Mysql()  # wrapper()
    obj2 = Mysql()
    obj3 = Mysql()
    obj4 = Mysql('1.1.1.2', 3303)
    print(obj1)
    print(obj2)
    print(obj3)
    print(obj4)

    方式三:自定义元类

    class Mymeta(type):
        def __init__(self, class_name, class_base, class_dic):
            # 先造好一个空对象
            self.instance = self(settings.IP, settings.PORT)
    
        def __call__(self, *args, **kwargs):
            if args or kwargs:
                # 拿到一个空对象
                obj = self.__new__(self)
    
                # 执行__init__方法为对象初始化属性
                self.__init__(obj, *args, **kwargs)
    
                # 返回一个实例化好的对象
                return obj
            return self.instance
    
    
    class Mysql(metaclass=Mymeta):
        def __init__(self, ip, port):
            self.ip = ip
            self.port = port
    
    
    obj1 = Mysql()  # 调用Mysql就是调用__call__方法
    obj2 = Mysql()
    obj3 = Mysql()
    obj4 = Mysql('1.1.1.4', 3301)
    print(obj1)
    print(obj2)
    print(obj3)
    print(obj4)

    方式四:利用模块的导入特性

    import settings
    
    class Mysql:
        def __init__(self, ip, port):
            self.ip = ip
            self.port = port
    
    
    instance = Mysql(settings.IP,settings.PORT)
    singleton.py
    def f1():
        from singleton import instance
        print(instance)
    
    
    def f2():
        from singleton import instance, Mysql
        print(instance)
        obj = Mysql('1.1.1.0', 3303)
        print(obj)
    
    
    f1()
    f2()
  • 相关阅读:
    栈和堆的详细介绍
    在DataTable中执行DataTable.Select("条件")返回DataTable;
    委托和事件
    面试宝典
    sql的寫法,推薦的寫法,全文索引提高類似like查詢的效率
    Google地图
    一般处理程序中,获取session
    提交表单
    手脱tElock 0.98b1 -> tE!
    手脱FSG 2.0 -> bart/xt
  • 原文地址:https://www.cnblogs.com/rongge95500/p/10578676.html
Copyright © 2011-2022 走看看