首页 > 编程语言 >python单例模式

python单例模式

时间:2023-10-06 19:34:36浏览次数:36  
标签:__ python 模式 instance 实例 单例 ._ path cls

Python单例模式的好处主要有以下几点:

  1. 节省资源:单例模式可以确保一个类只有一个实例,这样可以避免在多个地方创建相同的对象,从而节省内存和计算资源。

  2. 保证数据一致性:在多线程环境下,单例模式可以确保全局变量只被初始化一次,避免了多线程同时修改数据导致的数据不一致问题。

  3. 方便控制访问:单例模式可以提供一个全局访问点,使得其他对象只能通过这个访问点来访问该实例,方便对实例的访问控制。

Python单例模式的实现示例:

class Singleton:
    # 使用类属性_instance来存储唯一的实例
    _instance = None

    def __new__(cls, *args, **kwargs):
        # 如果_instance为None,说明还没有创建实例,则调用父类的__new__方法创建一个实例
        if cls._instance is None:
            cls._instance = super().__new__(cls)
        # 如果_instance已经存在,说明已经创建过实例,直接返回该实例
        return cls._instance

    def __init__(self):
        # 初始化实例时可以添加一些自定义操作
        pass

# 测试单例模式
singleton1 = Singleton()
singleton2 = Singleton()

print(singleton1 is singleton2)  # 输出True,说明singleton1和singleton2是同一个实例

 

Python类的单例模式实现。如果类DriverConfigure的实例不存在,那么就创建一个新的实例。这个新的实例会加载一个配置文件,并使用这个配置文件来初始化webdriver的远程驱动。

# driver_configure.py
# coding:utf-8
__author__ = 'may'
'''
description:driver配置

'''
import os.path
from appium import webdriver
from config import operator_yaml
from config.all_path import project_path


class DriverConfigure(object):
    def __new__(cls, *args, **kw):
        """
        使用单例模式将类型设置为运行时只有一个实例,
        在其他python类中使用基类时,
        可以创建多个对象,保证所有的对象都基于一个浏览
        :param args:
        :param kw:
        :return:
        hasattr()函数功能用来检测对象object中是否含有名为**的属性,
        如果有就返回True,没有就返回False
        """
        if not hasattr(cls, '_instance'):
            orig = super(DriverConfigure, cls)
            path = os.path.join(project_path, "config\config.yaml")
            data = operator_yaml.readconfigyaml(path)
            # 远程控制,通过appium可设置;若是真机,直接填写http://localhost:4723/wd/hub 或者http://127.0.0.1:4723/wd/hub即可
            cls._instance = orig.__new__(cls)
            # 发送指令到appium server
            cls._instance.driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", data["desired_caps"])
        return cls._instance


class DriverClinet(DriverConfigure):

    def get_driver(self):
        return self.driver

注释:

# 检查类是否已经有'_instance'属性,如果没有,则进入下面的代码块
if not hasattr(cls, '_instance'):
    # 调用父类的__new__方法创建一个新的对象,并将其赋值给orig
    orig = super(DriverConfigure, cls)
    # 构造配置文件的路径,配置文件位于项目路径下的config文件夹中,文件名为config.yaml
    path = os.path.join(project_path, "config\config.yaml")
    # 使用operator_yaml库的readconfigyaml方法读取配置文件的内容,返回的结果赋值给data
    data = operator_yaml.readconfigyaml(path)
    
    # 通过调用父类的__new__方法创建一个新的实例,并将其赋值给cls._instance
    cls._instance = orig.__new__(cls)
    
    # 使用从配置文件中读取的数据初始化webdriver的远程驱动,驱动的地址为"http://127.0.0.1:4723/wd/hub"
    cls._instance.driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", data["desired_caps"])
# 返回cls._instance,如果已经存在就直接返回,否则就创建一个新的实例并返回
return cls._instance

 

标签:__,python,模式,instance,实例,单例,._,path,cls
From: https://www.cnblogs.com/may18/p/17744871.html

相关文章

  • python - pdf转成excel文件
    初次尝试用python将pdf转换为excel表格,如有错误欢迎指出,需要用到的库如下:pipinstallpdfminer3kpipinstalltabula-pypipinstallopenpyxl如果是pip3,则:pip3installpdfminer3kpip3installtabula-pypip3installopenpyxl通过终端即可安装新建一个IDLE文件,源码如下:......
  • 工厂模式
    工厂模式顾名思义,工厂就是用来统一创建产品的。我们的工厂根据产品是具体产品还是工厂可以分为简单工厂模式和工厂方法模式,根据抽象程度可以分为工厂方法模式和抽象工厂模式。工厂模式的核心本质是:实例化对象不使用new,用工厂方法替代将选择实现类,创建对象统一管理和控制。从......
  • Python异步编程并发比较之循环、进程、线程、协程
    服务端现在有一个api接口http://127.0.0.1:18081/hello批量请求该接口,该接口中有一个5s的阻塞。使用循环,多进程,多线程,协程等四种方式,一共请求10次,比较总的请求耗时。importtimefromflaskimportFlaskapp=Flask(__name__)@app.route('/hello')defhello_world():......
  • Python分享之路径与文件 (os.path包, glob包)
    os.path包os.path包主要是处理路径字符串,比如说'/home/vamei/doc/file.txt',提取出有用信息。importos.pathpath='/home/vamei/doc/file.txt'print(os.path.basename(path))#查询路径中包含的文件名print(os.path.dirname(path))#查询路径中包含的目录info=......
  • # yyds干货盘点 # 盘点一个Python自动化办公实战实现数据汇总填充(方法四)
    大家好,我是皮皮。一、前言前几天在Python最强王者交流群【哎呦喂 是豆子~】问了一个Python自动化办公的问题,一起来看看吧。下图是他的原始数据和他想得到的目标数据,如下所示:需要在标黄的两行里边进行相关操作。二、实现过程之前的文章中【莫生气】使用了openpyxl进行了实现,的确可......
  • python11
    3.3字符串的公共功能1.相加:字符串+字符串v1="吉林省"+"长春市"print(v1)2.相乘:字符串*整数data="alex"*3print(data)3.长度data="吉林省长春市"value=len(data)print(value)4.获取字符串中的字符,索引message="吉林省长春市"#012......
  • Python使用socket的UDP协议实现FTP文件服务
    简介本示例主要是用Python的socket,使用UDP协议实现一个FTP服务端、FTP客户端,用来实现文件的传输。在公司内网下,可以不适用U盘的情况下,纯粹使用网络,来实现文件服务器的搭建,进而实现文件的网络传输。同时用来理解Python的socket使用。服务端运行起来后,会把服务器上面的指......
  • 为研究不同宽度,厚度,重量,车间温度,冷却方式下,物料温度随时间呈指数衰减的模型函数,
    为研究不同宽度,厚度,重量,车间温度,冷却方式下,物料温度随时间呈指数衰减的模型函数,请使用python按照下面的表格形式,生成模拟数据,数据预处理,选择模型,划分数据集,训练模型,调整超参数,预测和评估,并绘图谢谢您的反馈。我可以尝试改进模拟生成的df数据,以让它更加真实。......
  • 设计模式之工厂模式
    工厂模式是一种创建型设计模式,它提供了一个用于创建对象的接口,但允许子类决定实例化哪个类。工厂方法让一个类的实例化延迟到其子类。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在软件开发中,对象的创建和使用是常见的操作。然而,对象的创建过程常常会涉及......
  • Python缩进
    Python缩进在Python中,代码块没有显式的开始/结束或大括号来标记代码块的开始和结束。相反,代码块是通过缩进定义的。我们考虑一个极其简化的Python子集,其只有两种类型的语句:简单语句和$For$语句。简单语句(Simplestatements )仅占一行,每行一个。$For$语句(Forstatem......