查看: 192|回复: 0

python笔记23(面向对象课程五)

[复制链接]
发表于 2020-2-26 13:32:14 | 显示全部楼层 |阅读模式
今日内容



  • 上节作业

  • 单例模式
    1. class Foo:     pass  obj1 = Foo() # 实例,对象 obj2 = Foo() # 实例,对象
    复制代码

  • 日志模块(logging)

  • 程序的目录结构

内容回顾 & 作业

1.字符格式化

  1. msg = "我是%s,年龄%s" %('alex',19,) print(msg)  msg = "我是%(n1)s,年龄%(n2)s" % {'n1': 'alex', 'n2': 123, } print(msg)
复制代码
  1. # v1 = "我是{0},年龄{1}".format('alex',19) v1 = "我是{0},年龄{1}".format(*('alex',19,)) print(v1)  # v2 = "我是{name},年龄{age}".format(name='alex',age=18) v2 = "我是{name},年龄{age}".format(**{'name':'alex','age':18}) print(v2)
复制代码
2.有序字典

  1. from collections import OrderedDict  info = OrderedDict() info['k1'] = 123 info['k2'] = 456  print(info.keys()) print(info.values()) print(info.items())
复制代码
3.作业

3.1 栈和队列

  1. class Stack(object):     pass  class Queue(object):     pass
复制代码
3.2 反射

  1. class Cloud(object):      def upload(self):         pass          def download(self):         pass          def run(self):         # up|C:/xxx/xxx.zip         # down|xxxx.py         value = input('请用户输入要干什么?')         action = value.split('|')[0]         # 最low的形式         if action == 'up':             self.upload()         elif action == 'down':             self.download()         else:             print('输入错误')                  # 构造字典 (*)         method_dict = {'up':self.upload, 'down':self.download}          method = method_dict.get(action)         method()                   # 反射(*)          method = getattr(self,action) # upload  # self.upload         method()
复制代码
补充:
复制代码
3.3 循环过程中删除元素:

从列表后面面删除,可以正常删除。
如果从列表前删除,每删除一个,后面的元素都会向前站一会,后续删除出现错误。
内容详细

1.单例模式(23种筹划模式)

无论实例化多少次,永远用的都是第一次实例化出的对象。
  1. class Foo:     pass  # 多例,每实例化一次就创建一个新的对象。 obj1 = Foo() # 实例,对象 obj2 = Foo() # 实例,对象 # 单例,无论实例化多少次,都用第一次创建的那个对象。 obj1 = Foo() obj2 = Foo()
复制代码
单例模式尺度
  1. 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()  # 不是最终,加锁。
复制代码
文件的连接池
  1. 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') ==== class Foo(object):     instance = None     def __init__(self, path):         with open(path, mode='w', encoding='utf-8') as self.f1:             self.f1.write('zlex')      def __new__(cls, *args, **kwargs):         if not cls.instance:             cls.instance = object.__new__(cls)         return cls.instance  obj1 = Foo('alex.txt') obj2 = Foo('alex.txt')  print(obj1, obj2)
复制代码
2.模块导入



  • 多次导入重新加载
    1. import jd # 第一次加载:会加载一遍jd中所有的内容。 import jd # 由已经加载过,就不在加载。 print(456)
    复制代码
    1. import importlib import jd importlib.reload(jd)#主动重新加载 print(456)
    复制代码

通过模块导入的特性也可以实现单例模式:
  1. # jd.py class Foo(object):     pass  obj = Foo()
复制代码
  1. # app.py import jd # 加载jd.py,加载最后会实例化一个Foo对象并赋值给obj print(jd.obj)
复制代码
3.日志(模块 logging)



  • 基本应用

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

  • 保举处理日志方式
    1. 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('你好') #多次设置是无效的,只有第一次见效。
    复制代码

  • 保举处理日志方式 + 日志分割
    1. 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))
    复制代码
    注意事项
    1. # 在应用日志时,如果想要保留异常的堆栈信息。 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.项目结构目录



  • 脚本
    导入模块一个尺度:名称较短排在前面;第三方模块在后面import。

  • 单可执行文件
    1. import src.run import start if __name__=='__main__':     start()
    复制代码


相关技术服务需求,请联系管理员和客服QQ:2753533861或QQ:619920289
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

帖子推荐:
客服咨询

QQ:2753533861

服务时间 9:00-22:00

快速回复 返回顶部 返回列表