Python創建單例模式的三種方式

jopen 8年前發布 | 14K 次閱讀 Python 單例模式 Python開發

使用裝飾器

裝飾器維護一個字典對象instances,緩存了所有單例類,只要單例不存在則創建,已經存在直接返回該實例對象。

def singleton(cls):
    instances = {}

    def wrapper(*args, **kwargs):
        if cls not in instances:
            instances[cls] = cls(*args, **kwargs)
        return instances[cls]

    return wrapper


@singleton
class Foo(object):
    pass

foo1 = Foo()
foo2 = Foo()

print foo1 is foo2   # True

使用基類

__new__ 是真正創建實例對象的方法,所以重寫基類的 __new__ 方法,以此來保證創建對象的時候只生成一個實例

class Singleton(object):
    def __new__(cls, *args, **kwargs):
        if not hasattr(cls, '_instance'):
            cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
        return cls._instance


class Foo(Singleton):
    pass

foo1 = Foo()
foo2 = Foo()

print foo1 is foo2  # True

使用元類

元類(參考: 深刻理解Python中的元類 )是用于創建類對象的類,類對象創建實例對象時需要一定會調用 __call__ 方法,因此在調用 __call__ 時候保證始終只創建一個實例即可, type 是python中的一個元類。

class Singleton(type):
    def __call__(cls, *args, **kwargs):
        if not hasattr(cls, '_instance'):
            cls._instance = super(Singleton, cls).__call__(*args, **kwargs)
        return cls._instance


class Foo(object):
    __metaclass__ = Singleton


foo1 = Foo()
foo2 = Foo()

print foo1 is foo2  # True

來自: http://foofish.net/blog/93/python_singleton

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!