python单例模式

1、单例模式,也叫单子模式,是一种常用的软件设计模式。在应用这个模式时, 单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个 全局对象,这样有利于我们协调系统整体的行为。 --以上来自维基百科。

2、这里主要用来处理测试用例执行时每次都会调用登录的问题。添加单例模式+登录校验,实现了登录所在类只会实例化一次,且已经登录过时不会再进行登录初始化。

3、其中引用logging模块实现log打印。

4、该类被实例化时,优先调用new方法,判断是否已被实例化,如果未被实例化,则实例化该对象,并把该实例存在该类的_instance属性中,否则,直接返回该类的_instance实例;执行完new方法后,会执行init方法进行初始化,init方法每次都会被执行。

# _*_coding:utf-8 _*_
import json
import requests
import logging
import logging.handlers

class Http(object):
    def __init__(self):
        self.login_url = "xxx"
        self.my_url = "xxx"
        self.login_data = {
            "username":"xxx",
            "password":"xxx"
        }
        self.session = self.is_session()

    def is_session(self):
        try:
            session_id = id(self.session)
            if isinstance(session_id, int):
                return self.session
        except AttributeError as e:
            print(format(e))
            self.session = self.login()
            return self.session

    def __new__(cls):
        if not hasattr(cls, '_instance'):
            cls._instance = super(Http, cls).__new__(cls)
        return cls._instance

    def login(self):
        # LOG_FILE = 'tst.log'
        #
        # handler = logging.handlers.RotatingFileHandler(LOG_FILE, maxBytes=1024 * 1024, backupCount=5)  # 实例化handler
        # fmt = '%(asctime)s - %(name)s - %(message)s'
        #
        # formatter = logging.Formatter(fmt)  # 实例化formatter
        # handler.setFormatter(formatter)  # 为handler添加formatter
        #
        # logger = logging.getLogger('tst')  # 获取名为tst的logger
        # logger.addHandler(handler)  # 为logger添加handler
        # logger.setLevel(logging.DEBUG)
        #
        # logger.info('first info message')
        session = requests.session()
        session.post(self.login_url, data=self.login_data)
        # logger.info('end message')
        return session

    def post(self, params):
        req = self.session.post(self.my_url, data=params)
        # r.close()

        data = req.text
        # print(data)

        try:
            print('尝试第一次解析')
            json_str = json.loads(data)
            json_dict = eval(json_str)
            return json_dict
        except Exception as e:
            print('第一次解析失败:', format(e))

        try:
            print('尝试第二次解析')
            # 尝试替换原始字符串中的转义单引号
            json_str = eval(data).replace('\'', '"')
            json_str = json.loads(json_str)
            return json_str
        except Exception as e:
            print('第二次解析失败错误原因:', format(e))

        try:
            print('尝试第三次解析')
            json_str = json.loads(data)
            return json_str
        except Exception as e:
            print('第三次解析失败错误原因:', format(e))

if __name__ == '__main__':
    http = Http()
    http.post()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值