#-*- 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 class SingletonLogger(object): _instance = None def __new__(cls, *args, **kwargs): if not cls._instance: cls._instance = super...
本文介绍了几种在Python中实现单例模式的方法:使用类装饰器、元类以及 `__new__` 方法。每种方法都有其适用场景,可以根据具体需求选择最合适的方式。无论采用哪种方法,单例模式都能帮助我们在程序中有效地管理...
### Python单例模式的多种实现方法 #### 概述 单例模式是一种常见的设计模式,其核心在于确保一个类仅有一个实例,并且该实例能够全局访问。这种模式在某些场景下非常有用,例如管理共享资源、配置管理或日志记录等...
接下来,我们将详细介绍两种实现Python单例模式的方法。 **方法一:双重检查加锁** 这种方法的关键在于“双重检查”和“线程安全”。首先,我们定义一个类`Singleton`,并初始化一个类级别的变量`__instance`来...
总结来说,Python单例模式的实现旨在确保类只有一个实例并提供全局访问,通常采用饿汉式或懒汉式实现,其中懒汉式需处理多线程并发问题。同时,`@staticmethod`和`@classmethod`是Python类中两种特殊方法,前者与类...
总结,Python 实现单例模式的方式多样,可以根据具体需求选择合适的实现方法。模块、`__new__`、装饰器和元类都是有效的手段,它们都有各自的优缺点,需要根据实际应用场景灵活选择。在使用过程中,还需要考虑到线程...
在软件设计模式中,单例模式是一种常用的模式,它的核心思想是确保一个类在整个应用程序中只有一个实例,并提供一个全局访问点。在Python中,我们可以使用多种方式来实现单例设计模式。这里我们将详细探讨一种常见的...
在Python中实现单例模式有多种方法,常见的有使用全局变量、使用metaclass(元类)、重写__new__方法以及使用装饰器等。 首先,全局变量是最简单的一种实现方式。通过在模块级别定义一个类的实例,由于Python导入...
demo python使用装饰器(Decorator)的方式实现单例模式 functools.wraps 则可以将原函数对象的指定属性复制给包装函数对象, 默认有 __module__、__name__、__doc__,或者通过参数选择
压缩包文件代码是一个常见的设计模式——单例模式(Singleton Pattern) 的 Python 实现。单例模式确保一个类只有一个实例,并提供一个全局访问点来获取该实例。这在需要控制资源访问或需要协调系统范围内的操作时...
本篇文章将深入探讨Python中实现单例模式的几种方式以及它们的优缺点和优化策略。 首先,Python的模块机制实际上天然地支持单例模式。当模块首次被导入时,解释器会执行模块中的所有代码,生成相应的`.pyc`文件。...
单例模式是软件设计模式中的一种,其核心思想是确保一个类只有一个实例,并提供一个全局访问点。在Python中,由于解释器的特性,模块级别的变量实际上天然具有单例属性,因为模块只会被导入一次,因此模块内的变量也...
本文将详细介绍五种不同的Python单例模式实现方法,每种方法都有其特点与适用场景。 #### 方法一:通过`__new__`方法实现 这是最直接的单例实现方式之一,核心思想是在`__new__`方法中检查类是否已经有一个实例存在...
Python的单例实现与其他编程语言略有不同,主要是因为Python不支持私有构造函数,但通过类属性和方法的控制,我们依然可以实现单例模式。正确地使用单例模式可以使我们的应用程序更加高效和易于管理。
以下是一个简单的C++单例模式实现: ```cpp #include class Singleton { private: Singleton() {} // 私有构造函数 static Singleton* instance; // 静态成员变量 public: static Singleton* getInstance() {...
以下是一个基本的Python单例模式实现: ```python class Singleton(object): _instance = None def __new__(cls, *args, **kwargs): if not cls._instance: cls._instance = super(Singleton, cls).__new__...