web服务器

单例模式

2018-12-04  本文已影响73人  GHope

单例模式

实现方式一:使用元类形成约束

class SingletonMeta(type):

    def __init__(cls, *args, **kwargs):
        cls.__instance = None
        super().__init__(*args, **kwargs)

    def __call__(cls, *args, **kwargs):
        if cls.__instance is None:
            cls.__instance = super().__call__(*args, **kwargs)
        return cls.__instance


class President(object,metaclass=SingletonMeta):

    def __init__(self, name, year = 4):
        self.name = name
        self.year = year

实现方式二:魔术方法__new__

class Singleton(object):

    def __init__(self, name):
        self.name = name

    __instance = None

    def __new__(cls, *args, **kwargs):
        if cls.__instance is None:
            cls.__instance = super().__new__(cls)
        return cls.__instance

实现方式三:装饰器

from functools import wraps


# 装饰类的装饰器 - 被装饰的不是函数而是一个类
# singleton中的instances虽然是一个局部变量
# 但是由于singleton函数返回的wrapper函数中使用了该变量
# 所以它的生命周期会被延长(相当于是局部变量拥有了全局生命周期)
# 这种现象就称之为闭包(closure)
def singleton(cls):
    instances = {}

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

    return wrapper


@singleton
class A(object):

    def __init__(self, name):
        self.name = name

以上三种实现装饰器的方法中呢,推荐使用第三种。理由呢?便于理解啊,便于取消单例模式啊(.__wrapped__),便于使用啊。。。当然实现单例还有很多方法,有机会的话再研究研究吧!

上一篇 下一篇

猜你喜欢

热点阅读