| 注册
请输入搜索内容

热门搜索

Java Linux MySQL PHP JavaScript Hibernate jQuery Nginx
jopen
9年前发布

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 自行上传分享,仅供网友学习交流。所有权归原作者,若您的权利被侵害,请联系管理员。
 转载本站原创文章,请注明出处,并保留原始链接、图片水印。
 本站是一个以用户分享为主的开源技术平台,欢迎各类分享!
 本文地址:https://www.open-open.com/lib/view/open1452337753120.html
Python 单例模式 Python开发