• 单例模式


    单例模式

    整个过程中只有一个实例,所有生成的实例都指向同一块内存空间

    实现单例的第一种方法(通过类的绑定方法)

    #当用户输入端口和地址,实例化产生新对象
    #当用户不输入端口和地址,每次拿到的对象,都是同一个
    
    class Sql():
        instance=None
        def __init__(self,port,host):
            self.port=port
            self.host=host
        @classmethod
        def get_num(cls):
            import setting
            if not cls.instance:
                cls.instance=cls(setting.PORT,setting.HOST)
            return cls.instance
    #m每次调用get_num 拿到的对象都是同一个    
    s1=Sql.get_num()
    s2=Sql.get_num()
    print(s1)
    print(s2)
    s3=Sql('33066','8.8.8.8')
    print(s3)
    
    <__main__.Sql object at 0x0000027E22BE6C18>
    <__main__.Sql object at 0x0000027E22BE6C18>
    <__main__.Sql object at 0x0000027E22BE6BE0>
    
    
    #setting文件
    PORT=3306
    HOST='127.0.0.1'
    

    第二种方法:通过装饰器

    #当用户输入端口和地址,实例化产生新对象
    #当用户不输入端口和地址,每次拿到的对象,都是同一个
    
    def get_num(cls):
        #cls就是Sql这个类
        import setting
        instance=cls(setting.PORT,setting.HOST)
        def wrapper(*args,**kwargs):
            if len(args)!=0 or len(kwargs)!=0:
                #表示传了参数,生成新对象
                res=cls(*args,**kwargs)
                return res
            else:
                return instance
        return wrapper
    
    @get_num #会把下面的Sql当中参数传入,相当于:Sql=get_num(Sql)
    class Sql():
        def __init__(self,port,host):
            self.port=port
            self.host=host
    s1=Sql()
    s2=Sql()
    s3=Sql('33360','8:8:8:8')
    print(s1)
    print(s2)
    print(s3)
    

    第三种:通过元类

    #当用户输入端口和地址,实例化产生新对象
    #当用户不输入端口和地址,每次拿到的对象,都是同一个
    
    class Mymeta(type):
        def __init__(self,name,bases,dic):
            import setting
            self.instance=self(setting.PORT,setting.HOST)
        def __call__(self, *args, **kwargs):
            if len(args)!=0 or len(kwargs)!=0:
                obj=object.__new__(self)
                obj.__init__(*args,**kwargs)
                return obj
            else:
                return self.instance
            
    class Sql(metaclass=Mymeta):
        def __init__(self,port,host):
            self.port=port
            self.host=host
    s1=Sql()
    s2=Sql()
    s3=Sql('33306','8:8:8:8')
    print(s1)
    print(s2)
    print(s3)
    

    第四种:通过模块导入(python的模块是天然的单例)

    #num
    import setting
    class Sql():
        def __init__(self,port,host):
            self.port=port
            self.host=host
    
    s1=Sql(setting.PORT,setting.HOST)
    
    def test():
        from num import s1
        print(s1)
    def test2():
        from num import s1 as s2
        print(s2)
    
    test()
    test2()
    from num import s1
    from num import Sql
    s2=Sql('3306','8:8:8:8')
    print(s1)
    print(s2)
    
    
    
  • 相关阅读:
    Linux下监视GPU、CPU的使用情况
    2014多校第一场 E 题 || HDU 4865 Peter's Hobby (DP)
    2014多校第一场 I 题 || HDU 4869 Turn the pokers(费马小定理+快速幂模)
    2014多校第一场D题 || HDU 4864 Task (贪心)
    2014多校第一场J题 || HDU 4870 Rating(DP || 高斯消元)
    2014多校第一场A题 || HDU 4861 Couple doubi
    POJ 2948 Martian Mining(DP)
    POJ 2029 Get Many Persimmon Trees(DP||二维树状数组)
    POJ 3280 Cheapest Palindrome(DP)
    POJ 4044 Score Sequence
  • 原文地址:https://www.cnblogs.com/aden668/p/11460037.html
Copyright © 2020-2023  润新知