s21day23 python笔记
一、内容回顾及补充
-
字符串格式化
-
%s
# 示例一:特别注意:最后的右括号前面必须有逗号(,) msg = '我是%s,年龄%s'%('alex',19,) # 元组 # 示例二: msg = '我是%(name)s,年龄%(age)s'%{'name':'alex','age':19} # 字典 # 示例三:要想打印%,必须写两个%,即%% template = "%s现在的手机电量是100%%"%('alex',)
-
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种设计模式)
定义:无论实例化多少次,永远用的都是第一次实例化出的对象
应用场景:数据库连接,数据库连接池
-
单例模式标准
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')
-
通过模块导入的特性也可以实现单例模式:
# 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 项目分类
脚本:把所有代码写在一个py文件中
-
单可执行文件:只有一个可执行文件
# 可执行文件中包含: if __name__ == '__main__': pass
多可执行文件:有多个可执行文件
4.2 项目目录
-
包及其内含文件示例
- 可执行文件:bin
- 将所有可执行文件放入其中
- 业务相关:src
- 登陆注册相关:account.py
- 订单相关:order.py
- 主程序:run.py
- 公共类库:lib
- 分页功能
- 数据库:db
- 用户资料:user.txt
- 配置:config
- 设置:setting.py
- 日志存储:log
- 所有的日志文件
- 可执行文件:bin
-
注意:每个可执行文件必须把项目根目录加入sys.path中
import os import sys BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.append(BASE_DIR)