Python的单例模式

  一、何为单例模式

  单例模式:保证一个类仅有一个实例,并提供一个访问他的全局访问点。

  实现某个类只有一个实例的途径:

    1、让一个全局变量使得一个对象被访问,但是他不能防止外部实例化多个对象。

    2、让类自身保存他的唯一实例,这个类可以保证没有其他实例可以被创建。

  多线程时的单例模式:加锁-双重锁定

  饿汉式单例类:在类被加载时就将自己实例化(静态初始化)。其优点是躲避了多线程访问的安全性问题,缺点是提前占用系统资源。

  懒汉式单例类:在第一次被引用时,才将自己实例化。避免开始时占用系统资源,但是有多线程访问安全性问题。

  二、如何实现单例模式

  实现单例模式本人总结了三种方法:

  1、文件导入,当文件被当做模块被导入时,只执行一遍,因此一个类,只有一个实例,故此可为单例模式。

import test
#模块被导入时,自动执行test,创建唯一实例对象。

  2、类方法,创建单例模式。

class Foo(object):
	_instance = None

	def __init__(self):
		pass

	@classmethod
	def get_instance(cls):
		if cls._instance:
			return cls._instance
		else:
			obj = cls()
			cls._instance = obj
			return obj

obj1 = Foo.get_instance()
obj2 = Foo.get_instance()

# 用id(), ==, is检测,看是否为同一对象。
print(id(obj1))            # 39514520
print(id(obj2))            # 39514520
print(obj1 == obj2)    # True
print(obj1 is obj2)       # True

  3、__new__方法,比方法二要好,采用的还是传统的实例方法,即类名+()。避免了繁琐的文档说明。

class Foo(object):
    _instance = None

    def __init__(self):
        pass

    def __new__(cls, *args, **kwargs):
        if cls._instance:
            return cls._instance
        else:
            obj = object.__new__(cls,*args,**kwargs)
            cls._instance = obj
            return obj

# 还是传统的实例化对象方法。
obj1 = Foo()
obj2 = Foo()

# 用id() , == , is 检测,看是否为同一对象。

print(id(obj1))                 # 39514520
print(id(obj2))                 # 39514520
print(obj1 == obj2)        # True
print(obj1 is obj2)           # True

  期待更新……

时间: 2024-10-01 05:22:50

Python的单例模式的相关文章

Python 实现单例模式

# 使用Python实现单例模式 # 方法一: 使用__new__方法 class SingleTon(object):     def __new__(cls, *args, **kwargs):         if not hasattr(cls, '_instance'):             cls._instance = object.__new__(cls, *args, **kwargs)         return cls._instance class TestClas

python的单例模式:

python的单例模式:http://funhacks.net/2017/01/17/singleton/ https://www.cnblogs.com/huchong/p/8244279.html#_labelTop https://blog.csdn.net/weicao1990/article/details/79108193 django的相同名字的logger是单例模式的:logger1 = logging.getLogger('erebus') logger1是一个单例模式的实例

Python实现单例模式

Python实现单例模式 单例模式 介绍 意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 主要解决:一个全局使用的类频繁地创建与销毁. 何时使用:当您想控制实例数目,节省系统资源的时候. 如何解决:判断系统是否已经有这个单例,如果有则返回,如果没有则创建. 关键代码:构造函数是私有的. 应用实例: 1.一个班级只有一个班主任. 2.Windows 是多进程多线程的,在操作一个文件的时候,就不可避免地出现多个进程或线程同时操作一个文件的现象,所以所有文件的处理必须通过唯一的实例来进行

python实现单例模式的三种方式及相关知识解释

python实现单例模式的三种方式及相关知识解释 模块模式 装饰器模式 父类重写new继承 单例模式作为最常用的设计模式,在面试中很可能遇到要求手写.从最近的学习python的经验而言,singleton实现的四种方法都是python的重要特征,反过来也刚好是几种特征的最佳实现.(比如你平常开发中很难遇到几个需要写元类的地方)如果不能随手写出某种实现,说明你对于那种实现的概念还没有完全掌握.最近场通过写装饰器模式的singleton来复习装饰器概念. 1. module实现 #模块实现 from

Python入门之Python的单例模式和元类

本章内容 一.单例模式 二.元类 ============================= 一.单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在. 当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场.例如,某个服务器程序的配置信息存放在一个文件中,客户通过一个AppConfig的类来读取配置文件的信息.如果在程序运行期间,有很多地方需要使用配置文件的内容,也就是说,很多地方都需要创建AppConf

python中单例模式

一.单例模式设计基础概念: 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. 目的:让 类 创建对象,在系统中只有唯一的一个实例子 每一次执行 类名()返回的对象.内存地址是相同的 二.__new__方法: 使用类名()创建对象,Python解释器首先会调用__new__()方法为对象分配空间 __new__()是一个由objec基类提供的内置的静态方法,

python中单例模式的实现-通过闭包函数和魔术方法__new__实现单例模式

1.通过闭包函数实现单例模式: # 使用闭包函数实现单例 def single(cls, *args, **kwargs): instance = {} def get_instance(): if cls not in instance: instance[cls] = cls(*args, **kwargs) return instance[cls] return get_instance @single class Apple: pass a = Apple() b = Apple() p

python 之单例模式

单例模式1 单例=>只有一个单例2 静态方法+静态字段3 所有实例中等转的内容相同时 用单例模式class Sqllite: __instance=None def __init__(self): self.ip="127.0.0.1" self.port=3306 self.pwd="123456" self.username="root" self.conn_list=[1,2,3,4,5,6,7] @staticmethod def

Python设计模式——单例模式

单例模式是日常应用中最广泛的模式了,其目的就是令到单个进程中只存在一个类的实例,从而可以实现数据的共享,节省系统开销,防止io阻塞等等 但是在多进程的应用中,单例模式就实现不了了,例如一些web应用,django,这些,因为会启动多条进程来监听http请求,这样的会通过单例模式是实现不了数据共享的,也就是实现不了单例模式的目的了,这时可以尝试使用redis这些nosql数据库阿里实现数据共享,因为它们的读取数据库,当然也可以用mysql等数据库来共享,但是并发量一大,系统的压力就会很大了. #e