zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    OpenCV进阶之路:神经网络识别车牌字符
    System.ComponentModel.DataAnnotations.Schema.TableAttribute 同时存在于EntityFramework.dll和System.ComponentModel.DataAnnotations.dll中
    windows server 禁用智能卡服务的步骤
    yum 安装时错误 Errno 14 Couldn't resolve host 解决办法
    解决 CentOS7 安装完成后ifconfig命令不能用
    C#下RSA算法的实现(适用于支付宝和易宝支付)
    centos下问题:connect:network is unreachable
    maven 跳过单元测试
    Docker
    Jenkins和Docker
  • 原文地址:https://www.cnblogs.com/beiji/p/10062564.html
Copyright © 2011-2022 走看看