單例類
- 單例類采用重載new方法鸦难,返回一個類對象
- 實例化的類對象由new方法生成
- new方法在 init方法調(diào)用前調(diào)用
- 每次創(chuàng)建新對象時侨嘀,返回相同的類對象
類的單例裝飾器
- cls表示對類的引用(函數(shù)裝飾器一般用func,表示對函數(shù)的引用)
- 將類實例存放在字典中,利用類的引用作key,保證類對象的唯一性
# 使用__new__
class Singleton(object):
def __new__(cls):
if not hasattr(cls, 'instance'):
cls.instance = super(Singleton, cls).__new__(cls)
return cls.instance
# 使用裝飾器
def singleton(cls):
instance = dict()
def get_instance(*args, **kwargs):
if cls not in instance:
instance[cls] = cls(*args, **kwargs)
return instance[cls]
return get_instance
@singleton
class TEST(object):
pass
if __name__ == '__main__':
o1 = Singleton()
o2 = Singleton()
print id(o1), id(o2)
m1 = TEST()
m2 = TEST()
print id(m1), id(m2)
to-do 加上信息的裝飾器
代碼對比不加類裝飾器的情況
Java實現(xiàn)單例模式
github: https://github.com/buptxiaomiao/python_trick/blob/master/singleton.py