• 单例


    配置文件

    IP = '1.1.1.1'
    PORT = '3306'



    单例1.py
    # 单例模式  (省内存)
    # 基于某种方法实例化多次得到的实例是同一个
    # 为何用单例模式
    # 当实例化多次得到的对象中存取的属性都一样的情况下,应该将多个对象指向同一个内存,即同一个实例

    # 如何用:
    # 实现单例方式一

    import settings


    class Mysql():
    __isinstance = None

    def __init__(self,ip,port):
    self.ip = ip
    self.port = port

    @classmethod
    def from_conf(cls):
    if cls.__isinstance is None:
    cls.__isinstance = cls(settings.IP,settings.PORT)

    return cls.__isinstance

    obj1 = Mysql.from_conf()
    obj2 = Mysql.from_conf()
    obj3 = Mysql.from_conf()

    print(obj1)
    print(obj2)
    print(obj3)

    # <__main__.Mysql object at 0x1033a57f0>
    # <__main__.Mysql object at 0x1033a5ac8>
    # <__main__.Mysql object at 0x1033a5b70>


    # 仅适用于对象中存的东西一样

    # <__main__.Mysql object at 0x1033a57b8>
    # <__main__.Mysql object at 0x1033a57b8>
    # <__main__.Mysql object at 0x1033a57b8>

    # 不一样的单独造
    obj4 = Mysql('2.2.2.2',3309)
    print(obj4)




    单例2装饰器.py


    # 实现单例方式二
    import settings
    # 如果是从配置文件里面获取配置的话

    # 装饰器

    def singleton(cls): #func传被装饰的函数,类
    _instance = cls(settings.IP,settings.PORT) #放到类里面变成类属性 cls.__instance
    def wrapper(*args,**kwargs):
    if not args and not kwargs:
    return _instance
    return cls(*args,**kwargs)

    return wrapper


    @singleton
    class Mysql():
    def __init__(self,ip,port):
    self.ip = ip
    self.port = port

    obj1 = Mysql()
    obj2 = Mysql()
    obj3 = Mysql()
    print(obj1 is obj2 is obj3)
    obj4 = Mysql('2.2.2.2',3309)
    print(obj1)
    print(obj2)
    print(obj3)
    print(obj4)

    # # 运行过程,遇到@语法就会将装饰器正下方的那个名字当做参数传进来,然后将返回的结果重新赋值给这个名字:
    # @singleton #Mysql = singleton(Mysql)
    # class Mysql():
    # def __init__(self, ip, port):
    # self.ip = ip
    # self.port = port
    #
    #
    #
    # # singleton调用发生了
    # def singleton(cls): #cls = Mysql @singleton #Mysql = singleton(Mysql) Mysal = wrapper
    # def wrapper(*args,**kwargs):
    # res = cls(*args,**kwargs)
    # return res
    # return wrapper


    # obj = Mysql('1.1.1.1',3306)
    # print(obj.__dict__)



    单例3元类.py


    # 实现单例方式三
    import settings




    class Mymeta(type):
    def __init__(self,class_name, class_bases, class_dic): #在Mysql造出来之前发生的 self = Mysql
    super(Mymeta, self).__init__(class_name, class_bases, class_dic)
    obj = self.__new__(self) #造出一个Mysql的对象
    self.__init__(obj,settings.IP,settings.PORT) #从配置文件中加载配置完成Mysql对象的初始化
    # 保存下来
    self.__instance = obj

    # print(self.__instance)
    # print(self.__instance.__dict__)




    def __call__(self, *args, **kwargs):
    if len(args) == 0 and len(kwargs) == 0:
    return self.__instance

    obj = self.__new__(self)
    self.__init__(obj,*args,**kwargs)
    return obj









    class Mysql(object,metaclass=Mymeta):
    def __init__(self,ip,port):
    self.ip = ip
    self.port = port



    # Mysql()


    obj1 = Mysql()
    obj2 = Mysql()
    obj3 = Mysql()
    obj4 = Mysql('2.2.2.2',3309)
  • 相关阅读:
    html5 存储(删除)
    java 单例模式
    android知识点汇总
    java多线程 与 并发
    cuda GPU 编程之共享内存的使用
    vs 2015 + OPENGL 配置
    Ubuntu 14.04 安装 CUDA 问题及解决
    性能分析工具gprof介绍
    vim 换行方式 win 转Ubuntu vim 格式调整
    计算显卡对比
  • 原文地址:https://www.cnblogs.com/zhangrenguo/p/10044109.html
Copyright © 2020-2023  润新知