当前位置: 首页 > 编程笔记 >

常见的在Python中实现单例模式的三种方法

亢保赫
2023-03-14
本文向大家介绍常见的在Python中实现单例模式的三种方法,包括了常见的在Python中实现单例模式的三种方法的使用技巧和注意事项,需要的朋友参考一下

单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。

单例模式的要点有三个;一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。在Python中,单例模式有以下几种实现方式。

方法一、实现__new__方法,然后将类的一个实例绑定到类变量_instance上;如果cls._instance为None,则说明该类还没有被实例化过,new一个该类的实例,并返回;如果cls._instance不为None,直接返回_instance,代码如下:

class Singleton(object):
 
  def __new__(cls, *args, **kwargs):
    if not hasattr(cls, '_instance'):
      orig = super(Singleton, cls)
      cls._instance = orig.__new__(cls, *args, **kwargs)
    return cls._instance
 
class MyClass(Singleton):
  a = 1
 
one = MyClass()
two = MyClass()
 
#one和two完全相同,可以用id(), ==, is检测
print id(one)  # 29097904
print id(two)  # 29097904
print one == two  # True
print one is two  # True

方法二、本质上是方法一的升级版,使用__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, **kwargs):
    if cls._instance is None:
      cls._instance = super(Singleton2, cls).__call__(*args, **kwargs)
    return cls._instance
 
class MyClass2(object):
  __metaclass__ = Singleton2
  a = 1
 
one = MyClass2()
two = MyClass2()
 
print id(one)  # 31495472
print id(two)  # 31495472
print one == two  # True
print one is two  # True


方法三、使用Python的装饰器(decorator)实现单例模式,这是一种更Pythonic的方法;单利类本身的代码不是单例的,通装饰器使其单例化,代码如下:

def singleton(cls, *args, **kwargs):
  instances = {}
  def _singleton():
    if cls not in instances:
      instances[cls] = cls(*args, **kwargs)
    return instances[cls]
  return _singleton
 
@singleton
class MyClass3(object):
  a = 1
 
one = MyClass3()
two = MyClass3()
 
print id(one)  # 29660784
print id(two)  # 29660784
print one == two  # True
print one is two  # True
 类似资料:
  • 本文向大家介绍C#实现单件模式的三种常用方法,包括了C#实现单件模式的三种常用方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#实现单件模式的三种常用方法。分享给大家供大家参考。具体分析如下: 单件模式是一种设计模式,即保持同时只能创建一个实例,下面列出了C#实现单件模式的三种方法 方法1 方法2 方法3 希望本文所述对大家的C#程序设计有所帮助。

  • 本文向大家介绍Java单例模式实现的几种方式,包括了Java单例模式实现的几种方式的使用技巧和注意事项,需要的朋友参考一下 Java单例模式实现的几种方式 单例模式好多书上都是这么写的:   但是实际开发中是不会这么写的,因为有一个严重的问题,多线程并发访问的时候,可能会产生多个实例!! 下面列举几个常用的方法: 1.使用synchronized 关键字  2.加锁   3.利用静态变量: 以上就

  • 本文向大家介绍python中单例常用的几种实现方法总结,包括了python中单例常用的几种实现方法总结的使用技巧和注意事项,需要的朋友参考一下 前言 最近这两天在看自己之前写的代码,所以正好把用过的东西整理一下,单例模式,在日常的代码工作中也是经常被用到, 所以这里把之前用过的不同方式实现的单例方式整理一下 什么是单例? 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为

  • 本文向大家介绍C#中单例模式的三种写法示例,包括了C#中单例模式的三种写法示例的使用技巧和注意事项,需要的朋友参考一下 第一种最简单,但没有考虑线程安全,在多线程时可能会出问题,不过俺从没看过出错的现象,表鄙视我…… 第二种考虑了线程安全,不过有点烦,但绝对是正规写法,经典的一叉 第三种可能是C#这样的高级语言特有的,实在懒得出奇 哦,shit!

  • 本文向大家介绍C#实现单例模式的几种方法总结,包括了C#实现单例模式的几种方法总结的使用技巧和注意事项,需要的朋友参考一下 介绍 单例模式是软件工程学中最富盛名的设计模式之一。从本质上看,单例模式只允许被其自身实例化一次,且向外部提供了一个访问该实例的接口。通常来说,单例对象进行实例化时一般不带参数,因为如果不同的实例化请求传递的参数不同的话会导致问题的产生。(若多个请求都是传递的同样的参数的话,

  • 本文向大家介绍Java多线程中的单例模式两种实现方式,包括了Java多线程中的单例模式两种实现方式的使用技巧和注意事项,需要的朋友参考一下 Java多线程中的单例模式 一、在多线程环境下创建单例 方式一: 方式二: 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!