s21day23 python笔记

一、内容回顾及补充

  • 字符串格式化

    1. %s

      SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。
      # 示例一:特别注意:最后的右括号前面必须有逗号(,)
      msg = '我是%s,年龄%s'%('alex',19,)         # 元组
      
      # 示例二:
      msg = '我是%(name)s,年龄%(age)s'%{'name':'alex','age':19}      # 字典
      
      # 示例三:要想打印%,必须写两个%,即%%
      template = "%s现在的手机电量是100%%"%('alex',)
    2. format

      # 示例一:
      msg = '我是{0},年龄{1}'.format('alex',19)
      # 相当于
      msg = '我是{0},年龄{1}'.format(*('alex',19,))
      
      # 示例二:
      msg = '我是{name},年龄{age}'.format(name = 'alex',age = 18)
      # 相当于
      msg = '我是{name},年龄{age}'.format(**{'name':'alex','age':18})
  • 有序字典:

    from collections import OrderedDict
    info = OrderedDict()
    info['k1'] = 123
    info['k2'] = 456
    print(info.keys())
    print(info.values())
    print(info.items())
  • 反射补充:

    class Foo(object):
        def get(self):
            pass
    
    obj = Foo()
    # if hasattr(obj,'post'): 
    #     getattr(obj,'post')
    
    v1 = getattr(obj,'get',None) # 推荐
    print(v1)
  • 模块导入补充

    • 多次导入不再重新加载

      import jd # 第一次加载:会加载一遍jd中所有的内容。
      import jd # 由已经加载过,就不再加载。
      print(456)
    • 非要重新加载

      import importlib
      import jd
      importlib.reload(jd)
      print(456)

二、单例模式(23种设计模式)

  1. 定义:无论实例化多少次,永远用的都是第一次实例化出的对象

  2. 应用场景:数据库连接,数据库连接池

  3. 单例模式标准

    class Singleton(object):
        instance = None
        def __new__(cls, *args, **kwargs):
            if not cls.instance:
                cls.instance = object.__new__(cls)
            return cls.instance
    
    obj1 = Singleton()
    obj2 = Singleton()
    
    # 不是最终,加锁。
    • 文件的连接池
    class FileHelper(object):
        instance = None
        def __init__(self, path):
            self.file_object = open(path,mode='r',encoding='utf-8')
    
        def __new__(cls, *args, **kwargs):
            if not cls.instance:
                cls.instance = object.__new__(cls)
            return cls.instance
    
    obj1 = FileHelper('x')
    obj2 = FileHelper('x')
  4. 通过模块导入的特性也可以实现单例模式:

    # jd.py
    class Foo(object):
        pass
    
    obj = Foo()
    # app.py
    import jd # 加载jd.py,加载最后会实例化一个Foo对象并赋值给obj
    print(jd.obj)

三、日志模块:logging

  • 日志模块

  • 日志处理本质:Logger/FileHandler/Formatter

  • 推荐处理日志方式

    import logging
    
    file_handler = logging.FileHandler(filename='x1.log', mode='a', encoding='utf-8',)
    logging.basicConfig(
        format='%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',
        datefmt='%Y-%m-%d %H:%M:%S %p',
        handlers=[file_handler,],
        level=logging.ERROR
    )
    
    logging.error('你好')
  • 推荐处理日志方式 + 日志分割

    import time
    import logging
    from logging import handlers
    # file_handler = logging.FileHandler(filename='x1.log', mode='a', encoding='utf-8',)
    file_handler = handlers.TimedRotatingFileHandler(filename='x3.log', when='s', interval=5, encoding='utf-8')
    logging.basicConfig(
        format='%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',
        datefmt='%Y-%m-%d %H:%M:%S %p',
        handlers=[file_handler,],
        level=logging.ERROR
    )
    
    for i in range(1,100000):
        time.sleep(1)
        logging.error(str(i))

    注意事项:

    # 在应用日志时,如果想要保留异常的堆栈信息。
    import logging
    import requests
    
    logging.basicConfig(
        filename='wf.log',
        format='%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',
        datefmt='%Y-%m-%d %H:%M:%S %p',
        level=logging.ERROR
    )
    
    try:
        requests.get('http://www.xxx.com')
    except Exception as e:
        msg = str(e) # 调用e.__str__方法
        logging.error(msg,exc_info=True)

四、项目结果目录

4.1 项目分类

  1. 脚本:把所有代码写在一个py文件中

  2. 单可执行文件:只有一个可执行文件

    # 可执行文件中包含:
    if __name__ == '__main__':
        pass
  3. 多可执行文件:有多个可执行文件

4.2 项目目录

  1. 包及其内含文件示例

    • 可执行文件:bin
      • 将所有可执行文件放入其中
    • 业务相关:src
      • 登陆注册相关:account.py
      • 订单相关:order.py
      • 主程序:run.py
    • 公共类库:lib
      • 分页功能
    • 数据库:db
      • 用户资料:user.txt
    • 配置:config
      • 设置:setting.py
    • 日志存储:log
      • 所有的日志文件
  2. 注意:每个可执行文件必须把项目根目录加入sys.path中

    import os
    import sys
    
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    sys.path.append(BASE_DIR)
扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄