• 单例模式


    单例模式

    简述

    对于特定类只允许存在一个实例对象。

    UML

    python实现

    class Singleton:
        _singleton = None
        def __new__(cls, *args, **kwargs):
            if not cls._singleton:
                cls._singleton = super(Singleton, cls
                    ).__new__(cls, *args, **kwargs)
            return cls._singleton
    
    singleton1 = Singleton()
    singleton2 = Singleton()
    print(singleton1 is singleton2)

    代码思路

    每次创建对象时,先检查该类的实例对象是否存在,如果存在,则直接返回,

    如果不存在,则直接调用父类的__new__方法创建新的对象实例并保持在类的属性中,

    最后将其返回。

    python是如何创建对象的?

    首先调用__new__方法得到一个实例对象,

    然后调用__init__方法去初始化这个实例对象,并将其返回。

    这里还有一个细节,就是__new__方法的调用:

    默认__new__方法会从子类开始一直调用父类的__new__方法,

    直到调用object的__new__方法。

    装饰器实现单例模式

    def singleton_decorator(cls, *args, **kwargs):
        "单例装饰器"
        instance = {}
    
        def wrapper_singleton(*args, **kwargs):
            if cls not in instance:
                instance[cls] = cls(*args, **kwargs)
            return instance[cls]
    
        return wrapper_singleton
    
    
    @singleton_decorator
    class People:
    
    
        def __init__(self, name):
            self.name = name
    
        def print_name(self):
            print(self.name)
    
    p1 = People('tom')
    p2 = People('lily')
    
    print(p1 is p2)
    p1.print_name()
    p2.print_name()

    应用场景

    1.你希望这个类只有一个且只能有一个实例;

    2.项目中的一些全局管理类(Manager)可以用单例来实现。

  • 相关阅读:
    转 PHP in_array() 函数
    转 PHP Cookies
    华硕笔记本怎样调整屏幕亮度
    转 Oracle 12c: Managing Resources
    转 SQLPLUS中SQL换行执行
    转 php中$_request与$_post、$_get的区别
    TDB 12c : Transportable Database
    oracle (DBaaS) 服务介绍
    domain admin域管理员
    转 【TTS】AIX平台数据库迁移到Linux--基于RMAN(真实环境)
  • 原文地址:https://www.cnblogs.com/marton/p/10959470.html
Copyright © 2020-2023  润新知