Python – 单例实现的多种方法

单例模式就是确保一个类只有一个实例.当你希望整个系统中,某个类只有一个实例时,单例模式就派上了用场.比如,某个服务器的配置信息存在在一个文件中,客户端通过AppConfig类来读取配置文件的信息.如果程序的运行的过程中,很多地方都会用到配置文件信息,则就需要创建很多的AppConfig实例,这样就导致内存中有很多AppConfig对象的实例,造成资源的浪费.其实这个时候AppConfig我们希望它只有一份,就可以使用单例模式.

单例模式是一种软件设计模型。在面向对象编程中,通过单例模型只能创建一个类实例,也就是一个类永远只有一个实例对象。在工作中,为了确保某一个类只会创建一个实例,就需要使用单例模型。实现单例的方法有:

1.通过装饰器的方式实现单例

def singleton_func(cls):
    instances = {}

    def _singleton(*args, **kwargs):
        if cls not in instances:
            instances[cls] = cls(*args, **kwargs)
        return instances[cls]
    return _singleton

@singleton_func
class Phone(object):

    def Phone_id(self):
        return id(self)

p1 = Phone()
p2 = Phone()
print(p1.phone_id())
print(p2.phone_id())

2.使用实例化方式实现单例

class SingletonInstance(object):

    def __call__(self, *args, **kwargs):
        return self

SingletonInstance = SingletonInstance()
s1 = SingletonInstance()
s2 = SingletonInstance()
print(id(s1))
print(id(s2))

3.使用类装饰器实现单例

class SingletonDecorator(object):
    _instance = None

    def __init__(self, cls):
        self._cls = cls

    def __call__(self, *args, **kwargs):
        if self._instance is None:
            self._instance = self._cls(*args, **kwargs)
        return self._instance

@SingletonDecorator
class Phone(object):

    def phone_id(self):
        return id(self)

p1 = Phone()
p2 = Phone()
print(p1.phone_id())
print(p2.phone_id())

4.重写类的__new__方法实现单例

class SingletonClass(object):
    _instance = None

    def __new__(cls, *args, **kwargs):
        if cla._instance is None:
            cls._instance = super(SingletonClass, self).__new__(cls)
        return cls._instance

    _is_init = False

    def __init__(self):
        if self._is_init is False:
            print(‘-*-‘)
            self._is_init = True

s1 = SingletonClass()
s2 = SingletonClass()
print(id(s1))
print(id(s2))

②实现单例模式的方法有多种,之前再说元类的时候用call方法实现了一个单例模式,另外Python的模块就是一个天然的单例模式;

# 使用new关键字来实现一个单例模式
class Book:
    def __new__(cls, title):
        if nothasattr(cls, "_ins")
            cls._ins=super().__new__()
            print(‘in__new__‘)
            return cls._ins

    def __init__(self, title):
        print(‘in__init__‘)
        super().__init__()
        self.title = title

if __name__ == ‘__main__‘:
    b = Book(‘The Spider Book‘)
    b2 = Book(‘The Flask Book‘)
print(id(b))
print(id(b2))
print(b.title)
print(b2.title)

5.通过元类实现单例

class SingletonMeta(type, object):

    def __init__(self, *args, **kwargs):
        self._instance = None
        super(SingletonMeta, self).__init__(*arg, **kwargs)

    # _instance = None

    def __call__(self, *args, **kwargs):
        if self._instance is None
            self._instance = super(SingletonMeta, self).__call__(*args, **kwargs)
        return self._instance

class Phone(object, metaclass = SingletonMeta):

    def phone_id(self):
        return id(self)

p1 = Phone()
p2 = Phone()
print(p1.phone_id())
print(p2.phone_id())

②元类(metaclass)实现单例

class Singleton(type):
    def __init__(self, *args, **kwargs):
        print("in __init__")
        self.__instance = None
        super(Singleton, self).__init__(*args, **kwargs)

    def __call__(self, *args, **kwargs):
        print("in __call__")
        if self.__instance is None:
            self.__instance = super(Singleton, self).__call__(*args, **kwargs)
            return self.__instance

class Foo(metaclass=Singleton):
    pass

foo1 = Foo()
foo2 = Foo()
print(foo1 is foo2)

原文地址:https://www.cnblogs.com/qingaoaoo/p/12344935.html

时间: 2024-10-26 21:17:05

Python – 单例实现的多种方法的相关文章

Python单例的一种简单写法

最原始的想法就是每个类都重写new方法. class Dog: dog = None def __new__(cls, *args, **kwargs): if cls.dog is None: cls.dog = object.__new__(cls) print('create singleton over') return cls.dog def __init__(self, name): print('init is called') self.name = name # 下面这句话会报

Python——单例设计模式

单例设计模式: 让类创建的对象,在系统中只有唯一的实例, 使用python类内置的__new__()方法实现,__new__()方法在创建对象时会被自动调用,通过重写__new__()方法,使得无论用类型创建多少个对象,内存中都只创建一个对象的实例,此时__new__()方法必须返回此内置函数的调用,及return super().__new__(cls) class MyClass(): # 类属性,记录第一个被创建对象的引用 instance = None def __new__(cls,

Python单例

01. 单例设计模式 设计模式 设计模式 是 前人工作的总结和提炼,通常,被人们广泛流传的设计模式都是针对 某一特定问题 的成熟的解决方案 使用 设计模式 是为了可重用代码.让代码更容易被他人理解.保证代码可靠性 单例设计模式 目的 —— 让 类 创建的对象,在系统中 只有 唯一的一个实例 每一次执行 类名() 返回的对象,内存地址是相同的 单例设计模式的应用场景 音乐播放 对象 回收站 对象 打印机 对象 …… 02. __new__ 方法 使用 类名() 创建对象时,Python 的解释器 

java使用单例与使用static方法的对于和个人理解

最近在重构项目中的老模块,打算引入spring boot对原有项目自己封装的依赖注入模块进行替换.项目中存在大量的工具类,大都是使用static方法编写的,比如时间工具类用于格式化日期,编码工具类用于编码解码.研究了下是否有必要对这些常量方法的类进行单例重构. 首先要说明的是,两种方式都是可以实现功能的,只在一些特殊的场景会有些区别.除非比较感兴趣,一般是没必要太深究 区别和特点: 单例:有实例,有状态 静态方法:无实例,无状态,纯函数 静态方法实现方式的优点是突出了一个简单粗暴,不实例对象,并

单例设计模式和main方法

设计模式就是在大量的实践中总结和理论之后优选的代码结构.编程风格.以及解决问题的思考方式. 说白了设计模式就是在实际编程中逐渐总结出的解决问题的套路,类似于数学公式. 类的单例设计模式:在开发过程中有且只有一个实例化对象. 怎么做到在整个系统运行过程中,这个类只被实例化一次?不论在哪只调用这一个实例? 什么情况下使用单例设计模式? 实例化对象的创建要消耗大量的时间和资源,例如构造方法中的代码行太多.或者频繁的new的新对象没有必要. //饿汉式:一开始就new一个对象出来public class

实现单例设计模式的多种方式

Singleton:在Java中即指单例设计模式,它是软件开发中最常用的设计模式之一. 单例设计模式,即即某个类在整个系统中只能有一个实例对象可被获取和使用的代码模式. 例如:代表JVM运行环境的Runtime类 要点: - 某个类只能有一个实例:构造器私有化 - 它必须能够创建该类实例:使用该类的静态变量来保存这个唯一的实例. - 它必须能返回该实例:通过get方法返回该实例或直接暴露给外部. 一. 饿汉式:直接创建对象,不存在线程安全问题 1.1. 直接实例化饿汉式(简洁直观) /* * 饿

python单例类

class Single: __ISINCTANCE = None def __new__(cls, *args, **kwargs): if not cls.__ISINCTANCE: cls.__ISINCTANCE = object.__new__(cls) return cls.__ISINCTANCE def __init__(self,name,age): self.name = name self.age = age 单例类就是一个类即使实例化多个对象,每个对象占用的内存地址都是相

Python 之 安装模块的多种方法

1.自己写的模块,可以直接添加到路径下.这样就可以直接调用. import sys sys.path.append("/home/username/") 2.单文件模块 直接把文件拷贝到$python_dir/lib 3.网上下载的第三方库,一般解压后,找setup.py文件 运行python setup.py install 4. egg文件 1) 下载ez_setup.py,运行python ez_setup 2) easy_install *.egg 5.pip安装方法 Pip

单例的正确初始化方法

.h文件声明 + (MyHandle *)shareMyHandle; .m文件实现 #import "MyHandle.h" // 声明一个静态变量static MyHandle *myHandel = nil;@implementation MyHandle // 实现方法 + (MyHandel *)shareMyHandel { // 在GCD中只执行一次,用于记录是否执行过 static dispath_once_t onceToken; dispath_once(&