• python单例模式


    '''
    单例模式:存的一样的才用单例模式
    1 使用类方法
    2 装饰器实现
    3 使用元类
    '''

    # 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()
    #
    # print(obj1)
    # print(obj2)

    # 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

    #装饰器实现
    def singleton(cls):
    _instance=cls(settings.IP,settings.PORT)
    def wrapper(*args,**kwargs):
    if len(args)==0 and len(kwargs)==0:
    return _instance
    return cls(*args,**kwargs)
    return wrapper

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

    obj1=Mysql()
    print(obj1)
    obj2=Mysql()
    print(obj1)
    print(obj2)
    obj3=Mysql('1.1.1.1',3306)
    print(obj3)

    #使用元类实现

    # class Mymeta(type):
    # #类传过来,类名,基类,名称空间
    # def __init__(self,class_name,class_bases,class_dic):#类阶段先定义一个默认的,不传值以此为准
    # super().__init__(class_name,class_bases,class_dic)
    # self.__instance=self.__new__(self) #定义一个名称空间
    # self.__init__(self.__instance, settings.IP, settings.PORT) #名称空间传默认值
    #
    # def __call__(self, *args, **kwargs):#如果没传值以默认为准(在类定义阶段就创建好了),如果传值以此为准
    # # call则是在对象实例化的时候使用
    # if len(args)==0 and len(kwargs)==0:
    # return self.__instance
    # obj = self.__new__(self) #调用self(mysql类)的__new__方法,创建一个对象的名称空间并将名称空间命名为obj
    # self.__init__(obj, *args, **kwargs) #将args,kwargs传给obj空间,是obj独有的属性
    # return obj #返回obj对象
    #
    #
    # class Mysql(object,metaclass=Mymeta):
    # def __init__(self,ip,port):
    # self.ip=ip
    # self.port=port

    # obj1=Mysql()
    # print(obj1)
    # obj2=Mysql()
    # print(obj1)
    # print(obj2)
    # obj3=Mysql('1.1.1.1',3306)
    # print(obj3)
  • 相关阅读:
    linux文件种类及其扩展名
    路由器终端常用linux命令汇总(持续更新)
    初识Makefile
    volatile关键字作用
    无言
    coredump文件抓取设置
    connect设置连接超时
    unix socket服务器
    交叉编译工具链制作
    编译选项说明
  • 原文地址:https://www.cnblogs.com/beiji/p/10062564.html
Copyright © 2020-2023  润新知