• jimmy Windows 7    4月10日 10:06

    微博分享

    标签: 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

    方法二:使用基类

    __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

    方法三:使用元类

    元类是用于创建类对象的类,类对象创建实例对象时一定会调用__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

    上一篇:python 多进程 linux/unix/win 启动方式对比

    下一篇:Memcached 连接

  • 亲,使用会员登录 QQ帐号登录 后,在线交流才会学到更多知识哦~