1. 程式人生 > >python-單例模式&工廠模式

python-單例模式&工廠模式

**kwargs __new__ self. main ini name 實例 方法 not

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__方法實現單例模式,新式類為主









python-單例模式&工廠模式