首页 > 其他分享 >单例模式

单例模式

时间:2023-10-18 17:22:40浏览次数:32  
标签:__ self 模式 instance 单例 ._ def cls

使用模块

其实,**Python 的模块就是天然的单例模式**,因为模块在第一次导入时,会生成 `.pyc` 文件,当第二次导入时,就会直接加载 `.pyc` 文件,而不会再次执行模块代码。
因此,我们只需把相关的函数和数据定义在一个模块中,就可以获得一个单例对象了。如果我们真的想要一个单例类,可以考虑这样做:

mysingleton.py

class Singleton(object):
    def foo(self):
        pass
singleton = Singleton()

将上面的代码保存在文件 mysingleton.py 中,要使用时,直接在其他文件中导入此文件中的对象,这个对象即是单例模式的对象

from a import singleton

使用装饰

def Singleton(cls):
    instance = None

    def _singleton(*args, **kargs):
        nonlocal instance
        if not instance:
            instance = cls(*args, **kargs)
        return instance

    return _singleton


@Singleton
class A(object):
    def __init__(self, x=0):
        self.x = x


a1 = A(2)
a2 = A(3)
print(a1.x)
print(a2.x)

print(a1 is a2)

适用类方法

class Singleton(object):
    _instance=None
    def __init__(self):
        pass
    @classmethod
    def instance(cls, *args, **kwargs):
        if not cls._instance:
            cls._instance=cls(*args, **kwargs)
        return cls._instance

a1=Singleton.instance()
a2=Singleton().instance()

print(a1 is a2)

基于new方法实现

class Singleton(object):
    _instance=None
    def __init__(self):
        pass


    def __new__(cls, *args, **kwargs):
        if not cls._instance:
            cls._instance = object.__new__(cls)
        return cls._instance

obj1 = Singleton()
obj2 = Singleton()
print(obj1 is obj2)

基于metclass方式实现

class SingletonType(type):
    _instance=None
    def __call__(cls, *args, **kwargs):
        if not cls._instance:
            # cls._instance = super().__call__(*args, **kwargs)
            cls._instance = object.__new__(cls)
            cls._instance.__init__(*args, **kwargs)
        return cls._instance

class Foo(metaclass=SingletonType):
    def __init__(self,name):
        self.name = name


obj1 = Foo('name')
obj2 = Foo('name')
print(obj1.name)
print(obj1 is obj2)

补充问题

from django.contrib import admin
from django.urls import path, include
from home import views  # pycharm报错,但实际上不报错 ,只需要把加入到环境变量的路径都做成source root即可
from django.views.static import serve
from django.conf import settings
import os
from django.shortcuts import HttpResponse

class Foo():
    url = 'http://www.baidu.com'

    def demo(self,request):
        # self 就不是Foo的对象了,它是request对象
        print(type(self)) # django.core.handlers.wsgi.WSGIRequest
        print(self.url) # 'WSGIRequest' object has no attribute 'url'
        return HttpResponse('sdfa')


urlpatterns = [


    path('demo/', Foo().demo),  # Foo.demo(request)
]

 

标签:__,self,模式,instance,单例,._,def,cls
From: https://www.cnblogs.com/shanghaipudong/p/17772890.html

相关文章

  • 装饰模式(Decorator)
    定义动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式比生成子类更为灵活。装饰模式的结构和说明Component:组件对象的接口,可以给这些对象动态地添加职责。ConcreteComponent:具体的组件对象,实现组件对象接口,通常就是被装饰器装饰的原始对象,也就是可以给这个对象......
  • TSINGSEE风电场可视化智能视频集控监管系统,助力风电场无人值守监管新模式
    一、方案背景风能作为一种清洁的可再生能源,对于我国实现“双碳”目标尤为重要。风电场一般地处偏远地区,占地广、面积大,并且风机分布区域广泛、现场运行设备巡视难度大、及时性差。原有的监管系统智能化水平低,满足不了日常的生产安全、财产保障、运维管理等需求,因此,迫切需要构建一......
  • Java 设计模式之七大原则
    Java设计模式之七大原则|Drunkbaby'sBlog(drun1baby.top)1、认识设计模式1.1什么是设计模式所谓设计模式,就是对经常出现的软件设计问题的成熟解决方案。很多人把设计模式想象成非常高深的概念,实际上设计模式仅仅是对特定问题的一种惯性思维。笔者见过一些学员喜欢抱着一......
  • 设计模式之~策略模式
    策略模式是属于设计模式中的行为模式中的一种,策略模式主要解决选项过多的问题,避免大量的ifelse和switch下有太多的case。策略模式的重心不是如何实现算法,而是如何组织、调用这些算法,从而让程序结构更灵活,具有更好的维护性和扩展性。1.创建抽象策略接口publicinterfaceRe......
  • 10月18日元类、单例模式
    目录1.元类复习1.什么是元类:2.所有类的元类是谁?3.如何自定义元类呢?4.__init__和__new__和__call__这三者的关系:2.单例模式1.元类复习1.什么是元类:因为一切皆对象这个思想,所以类也是对象,元类构造类,类是由元类实例化得到的2.所有类的元类是谁?是type,它是所有......
  • 突破传统投资模式:发掘现货多元化投资平台的优势
    在过去,投资往往被视为许多人眼中的高门槛领域。传统的股票、债券等金融产品常常需要大量资金和专业知识,限制了一般投资者的参与度。然而,随着科技的发展和互联网的普及,现货多元化投资平台逐渐崭露头角,为投资者提供了更加灵活和开放的投资方式。现货多元化投资平台是指通过互联网平......
  • 10月18日单例模式
    目录单例模式值类的绑定方法,装饰器方式设计模式:实现单例模式的第一种方式第一种方式以类的绑定方法来实现实现单例模式的第二种方式实现单例模式的第三种方式单例模式的核心概念是:只有一个实例对象,而不管有多少人尝试访问它。第四种方法,通过模块导入(python的模块就是单例的体现)......
  • 设计模式(八)组合
    一、定义组合多个对象形成树形结构以表示具有部分-整体关系的层次结构。组合模式让客户端可以统一对待单个对象和组合对象。组合模式是一种结构型模式。二、描述包含以下三个角色:1、Component(抽象构件):它可以是接口或抽象类,为叶子构件和容器构件对象声明接口,在该角色中可以包含......
  • go语言使用单例模式封装数据库连接池
    packagesingledbimport( "gorm.io/driver/mysql" "gorm.io/gorm" "sync")//数据库连接对象只有一个var( db*gorm.DB Oncesync.Once//只执行一次某个操作的机制)funcGetDbInstance()*gorm.DB{ Once.Do(func(){ varerrerror dsn:=&q......
  • 职责链模式
    职责链模式案例引入OA(OfficeAutomation)系统的采购审批项目,需求是1.采购员采购教学用品。2.price>=0&&price<=5000由教学主任审批3.price>5000&&price<=10000由原则审批4.price>10000&&price<=30000由副校长审批5.price>30000由校长审批传统方式......