設計模式之------>>>單例模式
(一)什麼是單例模式
單例模式(Singleton Pattern)是一種常用的軟件設計模式,該模式的主要目的是確保某一個類只有一個實例存在。當你希望在整個系統中,某個類只能出現一個實例時,單例對象就能派上用場。
(二)實現單例的方法
- 導入模塊
- 使用new方法
- 使用裝飾器
(三)模塊
Python 模塊在第一次導入時,會生成 .pyc 文件,當第二次導入時,就會直接加載 .pyc 文件,而不會再次執行模塊代碼。因此,我們只需把相關的函數和數據定義在一個模塊中,就可以獲得一個單例對象了。
(四)new方法
# -*- coding: utf-8 -*-
__author__ = 'loco_python'
class Person(object):
_instance = None
_is_init = False
# 實現單例模式
def __new__(cls, *args, **kwargs):
if not cls._instance:
# 如果沒有創建對象,我們就創建對象
cls._instance = super(Person, cls).__new__(cls, *args, **kwargs)
# 無論如何我們只返回一個對象
return cls._instance
# 只做一次初始化。
def __init__(self, name, age):
if not self._is_init:
self.name = name
self.age = age
self._is_init = True
def __str__(self):
return self.name
p1 = Person('xiaohua', 18)
p2 = Person('xiaowang', 19)
# p1和p2同一地址
print id(p1), id(p2) # 4308349264 4308349264
# 只初始化了第一次
print p1, p2 # xiaohua xiaohua
(五)裝飾器
__author__ = 'loco_python'
from functools import wraps
def singleton(cls):
_instance = {}
@wraps(cls)
def wrapper(*args, **kwargs):
if cls not in _instance:
_instance[cls] = cls(*args, **kwargs)
return _instance[cls]
return wrapper
@singleton
class Person:
def __init__(self):
pass
p = Person()
p1 = Person()
print id(p), id(p1) # 4501461760 4501461760