欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

s21day23 python笔记

程序员文章站 2022-05-14 12:10:36
s21day23 python笔记 一、内容回顾及补充 字符串格式化 1. %s 2. format 有序字典: 反射补充: 模块导入补充 多次导入不再重新加载 非要重新加载 二、单例模式(23种设计模式) 1. 定义:无论实例化多少次,永远用的都是第一次实例化出的对象 2. 应用场景:数据库连接, ......

s21day23 python笔记

一、内容回顾及补充

  • 字符串格式化

    1. %s

      # 示例一:特别注意:最后的右括号前面必须有逗号(,)
      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)