zoukankan      html  css  js  c++  java
  • python实现单例模式

    有这么一种场景,我们把数据封装到类体或类的某个方法里,然而我们new出这个类只是为了拿到这部分数据,那么当多次这样调用的时候,每次都来拿数据并放到内存中大大浪费了内存。

    那我们就可以想,我们拿到一次数据以后,把它放到内存里,下次要用同样的时候做个判断,如果内存里有,那么就不用再取了。

    这个时候就要设计一种“单实例模式”。

    方法1:

    class Foo(object):
        __instance = None
    
        def __new__(cls, *args, **kwargs):
            """
            单例模式
            :param cls:
            :param args:
            :param kwargs:
            :return:
            """
            # 注意此处的判断,当cls.__instance为None时,才去真正的new,否则直接返回。
            if not cls.__instance:
                obj = object.__new__(cls, *args, **kwargs)
                cls.__instance = obj
            return cls.__instance

    object = Foo() # 先调用__new__,再调用__init__,__init__就类似于构造器。

    在此也要补充一下,python创造类的实例,其实和java一样,都叫new出来的,只不过Python是将这个new方法写成内置的了(__new__),那我们也可以知道,当写object = Foo()时,先调的__new__,再调的__init__。

    方法二:

    class Foo(object):
        instance = None
    
        def __init__(self):
            self.name = 'haha'
    # 其实和方法一的一个道理,建议用方法一。 @classmethod def get_instance(cls): if Foo.instance: return Foo.instance else: Foo.instance = Foo() return Foo.instance def process(self): return '123'
  • 相关阅读:
    网页特殊符号HTML代码大全
    TypeScript在react项目中的实践
    koa源码阅读[3]-koa-send与它的衍生(static)
    微任务、宏任务与Event-Loop
    koa源码阅读[2]-koa-router
    koa源码阅读[1]-koa与koa-compose
    koa源码阅读[0]
    TypeScript在node项目中的实践
    我的博客即将入驻“云栖社区”,诚邀技术同仁一同入驻。
    Javascript装饰器的妙用
  • 原文地址:https://www.cnblogs.com/NoYone/p/8277518.html
Copyright © 2011-2022 走看看