zoukankan      html  css  js  c++  java
  • python_study_10-单例模式

    前言:一些资源管理器常常设计成单例模式:类,可以用类生出多个变量,可有些场景不需要多个变量,项目比较大。比如配置文件,全局都只要一份配置,可在代码多次用并且不需要多次new对象,一个类只需要一个对象,就需要使用单例了。

    一、采用修饰器实现单例模式,修饰器的第一个参数应该是被修饰的类,可以采用字典来存储类实例,类作为key,实例作为值

    def singleton(cls, *args, **kwargs):
        _instance = {}
        def get_instance():
            if cls not in _instance:
                _instance[cls] = cls(*args, **kwargs)
            return _instance[cls]
        return get_instance
    
    @singleton
    class Singleton():
        pass
    
    sln1 = Singleton()
    sln2 = Singleton()
    print(id(sln1))
    print(id(sln2))
    
    output:
    sln1=11076560
    sln2=11076560


     二、类模式实现单例的关键在于构造器,__new__里控制类只被实例化一次,可以通过类属性保存类实例,判断类属性是否存在,不存在则实例化对象并赋值

    class Singleton(object):
        def __new__(cls, *args, **kwargs):
            if not hasattr(cls, '_instance'):
                cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
            return cls._instance
    
    sing1 = Singleton()
    sing2 = Singleton()
    print(id(sing1))
    print(id(sing2))
    output: sing1
    =18743952 sing2=18743952
  • 相关阅读:
    图基础模板
    POJ 2528 Mayor's posters(线段树+离散化)
    POJ 3468 A Simple Problem with Integers(线段树)
    poj 2251 Dungeon Master
    nyoj 540 奇怪的排序
    hdoj 1253 胜利大逃亡
    hdoj 2612 Find a way【bfs+队列】
    nyoj 915 +-字符串
    hdoj 1242 Rescue
    nyoj 1022 最少步数【优先队列+广搜】
  • 原文地址:https://www.cnblogs.com/hz-jelly/p/11013115.html
Copyright © 2011-2022 走看看