`
GhostFromheaven
  • 浏览: 396973 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Python单例模式的4种实现方法

阅读更多
#-*- encoding=utf-8 -*-
print '----------------------方法1--------------------------'
#方法1,实现__new__方法
#并在将一个类的实例绑定到类变量_instance上,
#如果cls._instance为None说明该类还没有实例化过,实例化该类,并返回
#如果cls._instance不为None,直接返回cls._instance
class Singleton(object):
    def __new__(cls, *args, **kw):
        if not hasattr(cls, '_instance'):
            orig = super(Singleton, cls)
            cls._instance = orig.__new__(cls, *args, **kw)
        return cls._instance

class MyClass(Singleton):
    a = 1

one = MyClass()
two = MyClass()

two.a = 3
print one.a
#3
#one和two完全相同,可以用id(), ==, is检测
print id(one)
#29097904
print id(two)
#29097904
print one == two
#True
print one is two
#True

print '----------------------方法2--------------------------'
#方法2,共享属性;所谓单例就是所有引用(实例、对象)拥有相同的状态(属性)和行为(方法)
#同一个类的所有实例天然拥有相同的行为(方法),
#只需要保证同一个类的所有实例具有相同的状态(属性)即可
#所有实例共享属性的最简单最直接的方法就是__dict__属性指向(引用)同一个字典(dict)
#可参看:http://code.activestate.com/recipes/66531/
class Borg(object):
    _state = {}
    def __new__(cls, *args, **kw):
        ob = super(Borg, cls).__new__(cls, *args, **kw)
        ob.__dict__ = cls._state
        return ob

class MyClass2(Borg):
    a = 1

one = MyClass2()
two = MyClass2()

#one和two是两个不同的对象,id, ==, is对比结果可看出
two.a = 3
print one.a
#3
print id(one)
#28873680
print id(two)
#28873712
print one == two
#False
print one is two
#False
#但是one和two具有相同的(同一个__dict__属性),见:
print id(one.__dict__)
#30104000
print id(two.__dict__)
#30104000

print '----------------------方法3--------------------------'
#方法3:本质上是方法1的升级(或者说高级)版
#使用__metaclass__(元类)的高级python用法
class Singleton2(type):
    def __init__(cls, name, bases, dict):
        super(Singleton2, cls).__init__(name, bases, dict)
        cls._instance = None
    def __call__(cls, *args, **kw):
        if cls._instance is None:
            cls._instance = super(Singleton2, cls).__call__(*args, **kw)
        return cls._instance

class MyClass3(object):
    __metaclass__ = Singleton2

one = MyClass3()
two = MyClass3()

two.a = 3
print one.a
#3
print id(one)
#31495472
print id(two)
#31495472
print one == two
#True
print one is two
#True

print '----------------------方法4--------------------------'
#方法4:也是方法1的升级(高级)版本,
#使用装饰器(decorator),
#这是一种更pythonic,更elegant的方法,
#单例类本身根本不知道自己是单例的,因为他本身(自己的代码)并不是单例的
def singleton(cls, *args, **kw):
    instances = {}
    def _singleton():
        if cls not in instances:
            instances[cls] = cls(*args, **kw)
        return instances[cls]
    return _singleton

@singleton
class MyClass4(object):
    a = 1
    def __init__(self, x=0):
        self.x = x

one = MyClass4()
two = MyClass4()

two.a = 3
print one.a
#3
print id(one)
#29660784
print id(two)
#29660784
print one == two
#True
print one is two
#True
one.x = 1
print one.x
#1
print two.x
#1

 

分享到:
评论

相关推荐

    使用python写的单例模式日志记录器(设计模式之单例模式)

    下面是一个简单的Python单例模式日志记录器的实现: ```python class SingletonLogger(object): _instance = None def __new__(cls, *args, **kwargs): if not cls._instance: cls._instance = super...

    在Python中实现单例模式.docx

    本文介绍了几种在Python中实现单例模式的方法:使用类装饰器、元类以及 `__new__` 方法。每种方法都有其适用场景,可以根据具体需求选择最合适的方式。无论采用哪种方法,单例模式都能帮助我们在程序中有效地管理...

    python单例模式的多种实现方法

    ### Python单例模式的多种实现方法 #### 概述 单例模式是一种常见的设计模式,其核心在于确保一个类仅有一个实例,并且该实例能够全局访问。这种模式在某些场景下非常有用,例如管理共享资源、配置管理或日志记录等...

    Python单例模式的两种实现方法

    接下来,我们将详细介绍两种实现Python单例模式的方法。 **方法一:双重检查加锁** 这种方法的关键在于“双重检查”和“线程安全”。首先,我们定义一个类`Singleton`,并初始化一个类级别的变量`__instance`来...

    Python单例模式实例详解

    总结来说,Python单例模式的实现旨在确保类只有一个实例并提供全局访问,通常采用饿汉式或懒汉式实现,其中懒汉式需处理多线程并发问题。同时,`@staticmethod`和`@classmethod`是Python类中两种特殊方法,前者与类...

    Python单例模式的四种创建方式实例解析

    总结,Python 实现单例模式的方式多样,可以根据具体需求选择合适的实现方法。模块、`__new__`、装饰器和元类都是有效的手段,它们都有各自的优缺点,需要根据实际应用场景灵活选择。在使用过程中,还需要考虑到线程...

    python单例设计模式实现解析

    在软件设计模式中,单例模式是一种常用的模式,它的核心思想是确保一个类在整个应用程序中只有一个实例,并提供一个全局访问点。在Python中,我们可以使用多种方式来实现单例设计模式。这里我们将详细探讨一种常见的...

    Python中实现单例模式的n种方式和原理

    在Python中实现单例模式有多种方法,常见的有使用全局变量、使用metaclass(元类)、重写__new__方法以及使用装饰器等。 首先,全局变量是最简单的一种实现方式。通过在模块级别定义一个类的实例,由于Python导入...

    python使用装饰器(Decorator)的方式实现单例模式

    demo python使用装饰器(Decorator)的方式实现单例模式 functools.wraps 则可以将原函数对象的指定属性复制给包装函数对象, 默认有 __module__、__name__、__doc__,或者通过参数选择

    通过python实现单例模式(类变量).rar

    压缩包文件代码是一个常见的设计模式——单例模式(Singleton Pattern) 的 Python 实现。单例模式确保一个类只有一个实例,并提供一个全局访问点来获取该实例。这在需要控制资源访问或需要协调系统范围内的操作时...

    Python中的单例模式的几种实现方式的及优化

    本篇文章将深入探讨Python中实现单例模式的几种方式以及它们的优缺点和优化策略。 首先,Python的模块机制实际上天然地支持单例模式。当模块首次被导入时,解释器会执行模块中的所有代码,生成相应的`.pyc`文件。...

    详解python实现线程安全的单例模式

    单例模式是软件设计模式中的一种,其核心思想是确保一个类只有一个实例,并提供一个全局访问点。在Python中,由于解释器的特性,模块级别的变量实际上天然具有单例属性,因为模块只会被导入一次,因此模块内的变量也...

    5种Python单例模式的实现方式

    本文将详细介绍五种不同的Python单例模式实现方法,每种方法都有其特点与适用场景。 #### 方法一:通过`__new__`方法实现 这是最直接的单例实现方式之一,核心思想是在`__new__`方法中检查类是否已经有一个实例存在...

    python单例模式原理与创建方法实例分析

    Python的单例实现与其他编程语言略有不同,主要是因为Python不支持私有构造函数,但通过类属性和方法的控制,我们依然可以实现单例模式。正确地使用单例模式可以使我们的应用程序更加高效和易于管理。

    设计模式单例模式示例代码(python--c++)

    以下是一个简单的C++单例模式实现: ```cpp #include class Singleton { private: Singleton() {} // 私有构造函数 static Singleton* instance; // 静态成员变量 public: static Singleton* getInstance() {...

    设计模式专题之(一)单例模式---设计模式单例模式模式示例代码(python--c++)

    以下是一个基本的Python单例模式实现: ```python class Singleton(object): _instance = None def __new__(cls, *args, **kwargs): if not cls._instance: cls._instance = super(Singleton, cls).__new__...

Global site tag (gtag.js) - Google Analytics