python-单例模式&工厂模式

1.单例模式

  类外装饰器实现单例模式,是拦截整个实例化过程。(__new__;__init__)

def singleton(cls):
    _instance = {}
    def func(*args,**kwargs):
        if cls not in _instance:
            _instance[cls] = cls(*args,**kwargs)
        return _instance[cls]
    return func

@singleton
class Test(object):
    def __init__(self,name):
        self.name = name

if __name__ == '__main__':
    a = Test('BOB')
    b = Test('JON')

    print(a is b)
    print(id(a),id(b))
在上面,我们定义了一个装饰器 singleton,它返回了一个内部函数 func,
该函数会判断某个类是否在字典 _instances 中,如果不存在,则会将 cls 作为 key,cls(*args, **kwargs) 作为 value 存到 _instances 中,
否则,直接返回 _instances[cls]。
 

class Singleton(object):
    _instance = None

    def __new__(cls, *args, **kwargs):
        if not cls._instance:
            cls._instance = object.__new__(cls,*args,**kwargs)
        return cls._instance


class Test(Singleton):

    def __init__(self):
        self.name = 'bob'


if __name__ == '__main__':
    a = Test()
    b = Test()
    
    print(a is b)

*************************************************************************************************************************************************

# instance_dict = {}
#
# class B(object):
# __float = 0
#
# def __new__(cls, *args, **kwargs):
# if cls not in instance_dict:
# instance_dict[cls] = object.__new__(cls, *args, **kwargs)
#
# return instance_dict[cls]
#
# def __init__(self, name):
# if self.__float == 0:
# self.my_name = name
# self.__float = 1
#
#
# if __name__ == '__main__':
# a = B(1)
# b = B(2)
# print a.my_name, b.my_name
类内实现单例模式,只拦截了__new__生成对象的过程,没有拦截初始化实例属性的过程

拦截__new__方法实现单例模式,新式类为主









转载于:https://www.cnblogs.com/jiuzha/p/9362679.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值