关于python的单实例模式

单实例模式一直是常用的设计模式,对于python的单实例模式,其实其本身就有实现

http://stackoverflow.com/questions/31875/is-there-a-simple-elegant-way-to-define-singletons-in-python/31887#31887

里面说到module,module只会初始化一次,天然的singleton。这是最为python的解决方案。将你所需要的属性和方法,直接暴露在模块中变成模块的全局变量和方法即可。

另外,如果真的要使用代码进行singleton,下面给出几个代码

# Singleton/ClassVariableSingleton.py
class SingleTone(object):
    __instance = None
    def __new__(cls, val):
        if SingleTone.__instance is None:
            SingleTone.__instance = object.__new__(cls)
        SingleTone.__instance.val = val
        return SingleTone.__instance
# Singleton/SingletonDecorator.py
class SingletonDecorator:
    def __init__(self,klass):
        self.klass = klass
        self.instance = None
    def __call__(self,*args,**kwds):
        if self.instance == None:
            self.instance = self.klass(*args,**kwds)
        return self.instance

class foo: pass
foo = SingletonDecorator(foo)

x=foo()
y=foo()
z=foo()
x.val = ‘sausage‘
y.val = ‘eggs‘
z.val = ‘spam‘
print(x.val)
print(y.val)
print(z.val)
print(x is y is z)
# Singleton/SingletonMetaClass.py
class SingletonMetaClass(type):
    def __init__(cls,name,bases,dict):
        super(SingletonMetaClass,cls)          .__init__(name,bases,dict)
        original_new = cls.__new__
        def my_new(cls,*args,**kwds):
            if cls.instance == None:
                cls.instance =                   original_new(cls,*args,**kwds)
            return cls.instance
        cls.instance = None
        cls.__new__ = staticmethod(my_new)

class bar(object):
    __metaclass__ = SingletonMetaClass
    def __init__(self,val):
        self.val = val
    def __str__(self):
        return `self` + self.val

x=bar(‘sausage‘)
y=bar(‘eggs‘)
z=bar(‘spam‘)
print(x)
print(y)
print(z)
print(x is y is z)

关于python的单实例模式,布布扣,bubuko.com

时间: 2024-12-16 23:48:55

关于python的单实例模式的相关文章

python的单实例模式

先看下单实例的定义 这里我们主要学习一下基于模块实现单例对象,这里利用的原理就是python的模块导入的特性,这个模块被第一次导入,会被执行一次,但是如果这个模块被再次导入,无论是在相同的文件还是在不同的文件中,第二次导入都不会再次执行 如果要想通过模块导入实现单实例模式,则必须要在一个文件中定义一个类,这里要切记,在这个文件中一定要实例化这个类,然后在其他文件中导入这个实例对象,那么所有的文件中用的实例对象都是相同的一个 比如我们看下下面的例子 在mysingle.py文件中我们定义了一个类,

设计模式(三)单实例模式

引言 对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务:一个系统只能有一个窗口管理器或文件系统:一个系统只能有一个计时工具或ID(序号)生成器.如在Windows中就只能打开一个任务管理器.如果不使用机制对窗口对象进行唯一化,将弹出多个窗口,如果这些窗口显示的内容完全一致,则是重复对象,浪费内存资源:如果这些窗口显示的内容不一致,则意味着在某一瞬间系统有多个状态,与实际不符,也会给用户带来误解,不知道哪一个才是真实的状态.因此有时确保

单实例模式和互斥访问

场景说明:在实际的应用开发中,很多人没有注意到一点:在生成单实例的过程中,如果由线程去创建对象的实例,有可能在第一次检测到对象不存在的情况下,准备创建对象,此时由于多线程的缘故,恰巧当前线程被挂起,另一个线程同样执行到这个语句,于是创建一个对象,另一个线程冲睡眠中被唤醒,于是执行了创建对象,现在就有两个对象,完全背离了单实例的设计模式, 解决方法: 1)在主线程还没有创建多线程的时候,创建单实例,但是这里有一个问题:就不会达到延时加载的效果,变成了急剧加载,也就是说预先加载了对象,可能这个对象根

单实例模式

  前言:   单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中(jvm)一个类只有一个实例.即一个类只有一个对象实例:这几种模式有几种好处: 1.可以避免实例存在多个引起程序的逻辑错误(比如一个国家有多个主席,肯定会一团糟) 2.某些创建频繁的类,使用单列模式可以减轻内存的压力 3.因为类控制了实例化过程,所以类可以灵活更改实例化过程.   单列模式的三种模式: 1.饿汉模式 //饿汉式--典型的穷屌丝,吃了上顿没下顿.所以要提前准备(

线程安全的单实例模式

我们都很清楚一个简单的单例模式该怎样去实现:构造函数声明为private或protect防止被外部函数实例化,内部保存一个private static的类指针保存唯一的实例,实例的动作由一个public的类方法代劳,该方法也返回单例类唯一的实例.单例大约有两种实现方法:懒汉与饿汉.懒汉:故名思义,不到万不得已就不会去实例化类,也就是说在第一次用到类实例的时候才会去实例化,节省内存.饿汉:饿了肯定要饥不择食.所以在单例类定义的时候就进行实例化.浪费内存特点与选择:由于要进行线程同步,所以在访问量比

3.1.17 自定义元类控制类的实例化的应用--单实例模式

#单例模式#实现方式一:# class MySQL:# __instance=None #__instance=obj1## def __init__(self):# self.host='127.0.0.1'# self.port=3306## @classmethod# def singleton(cls):# if not cls.__instance:# obj=cls()# cls.__instance=obj# return cls.__instance### def conn(se

python单实例

什么是python的单实例? 在python中如果没有特意指定我们所创建类的基类时,那么所有的类都继承于type这个类的祖宗,所有我们创建的类都是type这个鼻祖的实例. 例如: class A: def __init__(self): self.welcom = "hello world!" def __str__(self): return repr(self.welcom) a = A() print(a) 这是一个简单的类,在定义的时候没有显示的指定A这个类的基类,所以A这个类

C#设计模式-单实例

单例模式就是保证在整个应用程序的生命周期中,在任何时刻,被指定的类只有一个实例,并为客户程序提供一个获取该实例的全局访问点. 1.经典的模式 namespace singleClass { class OnlyOneClass { private OnlyOneClass() { } private static OnlyOneClass instance; public static OnlyOneClass getInstance() { if (instance == null) { in

MySQL MGR集群单主模式的自动搭建和自动化故障修复

/*the waiting game:尽管人生如此艰难,不要放弃:不要妥协:不要失去希望*/ 随着MySQL MGR的版本的升级以及技术成熟,在把MHA拉下神坛之后, MGR越来越成为MySQL高可用的首选方案.MGR的搭建并不算很复杂,但是有一系列手工操作步骤,为了简便MGR的搭建和故障诊断,这里完成了一个自动化的脚本,来实现MGR的自动化搭建,自动化故障诊断以及修复. MGR自动化搭建为了简便起见,这里以单机多实例的模式进行测试,先装好三个MySQL实例,端口号分别是7001,7002,70