20200617----python学习第23天

今日内容

  上节作业

  单例模式     

class Foo:
pass

obj1 = Foo() #实例 对象
obj2 = Foo() #实例 对象

  日志模块logging

  程序的目录结构

内容回顾&作业

  1.字符串格式化   

msg1 = "我是%s,年龄%s" %('alex',19)
print(msg1)
msg2 = "我是%(n1)s,年龄%(n2)s"%{'n1':'alex','n2':20}
print(msg2)

v1 = "我是{0},年龄{1}".format('alex',21) #用到的是位置参数 *args
v2 = "我是{0},年龄{1}".format(*('alex',21)) #用到的是位置参数 *args
print(v1)
print(v2)
#输出内容为:
# 我是alex,年龄21
# 我是alex,年龄21

v3= "我是{name},年龄{age}".format(name = 'alex',age= 22) #用到的是关键字参数 **kwargs
v4 = "我是{name},年龄{age}".format(**{'name':'alex','age':22})
print(v3)
print(v4)
#输出内容为:
# 我是alex,年龄22
# 我是alex,年龄22

  2.有序字典 

字典原本是无序的,但可以创建有序的,示例如下:
from collections import OrderedDict
info = OrderedDict() #创建一个对象
info['k1'] = 123 #用到了getattr与setattr
info['k2'] = 456
print(info.keys()) #输出内容为:odict_keys(['k1', 'k2'])
print(info.values()) #输出内容为:odict_values([123, 456])
print(info.items()) #输出内容为:odict_items([('k1', 123), ('k2', 456)])

  3.作业

    3.1栈和队列

class Stack(object):
pass

class Queue(object):
psse

    3.2反射

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.strip('|')[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)
#补充
class Foo(object):
def get(self):
pass
obj = Foo()

#方法一:
if hasattr(obj,'post'):
getattr(obj,'post')

#方法二:
v1 = getattr(obj,'post',None) #推荐 getattr性能要比hasattr好 如果有就调用post方法,如果没有,就返回None
print(v1)

    3.3循环过程中删除元素:pass

内容详细

  1.单例模式

    无论实例化多少次,永远用的都是第一次示例化出的对象。

    

class Foo:
pass

#多例(没有该叫法),每实例化一次就会创建一个新的对象。
obj1 = Foo() #实例 对象
obj2 = Foo() #实例 对象
print(obj1,obj2)
#输出内容:<__main__.Foo object at 0x000001A8A9718430> <__main__.Foo object at 0x000001A8A97273A0> 两者内存地址不同

#单例 无论实例化多少次,都哦那个第一次创建的那个对象
#单例模式标准

class Singleton(object):
instance = None
def __new__(cls, *args, **kwargs):
"""
如果没有就创建instance,如果有就返回instance
:param args:
:param kwargs:
:return:
"""
if not cls.instance:
cls.instance = object.__new__(cls)
return cls.instance
obj3 = Singleton()
obj4 = Singleton()
print(obj3,obj4)
#不是最终,需要加锁
#输出内容为:<__main__.Singleton object at 0x000001376D610B80> <__main__.Singleton object at 0x000001376D610B80>
#两者内存地址相同,所以调用同一个实例化对象
#文件连接池
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.txt')
obj2 = FileHelper('x.txt')
print(obj1,obj2)
#输出内容<__main__.FileHelper object at 0x000001ECC67573A0> <__main__.FileHelper object at 0x000001ECC67573A0>
#表示文件打开一次,就不在反复关闭打开了。

  2.模块导入

    

#多次导入重新加载
import day23.jd #第一次加载:会加载一遍jd中所有的内容
import day23.jd #由已经加载过,就不再加载了
print(456)
#输出结果为:123 456

#非要重新加载的方法
import importlib
import day23.jd
importlib.reload(day23.jd)
print(456)
#输出结果为:
# 123
# 123
# 456

#通过模块导入的特性也可以实现单例模式:
#jd.py
x =2
class Foo(object):
def func(self):
pass
obj = Foo()

#app.py
import day23.jd as jd
print(jd.x)
print(jd.Foo)
print(jd.obj)
#输出结果为:
# 2
# <class 'day23.jd.Foo'>
# <day23.jd.Foo object at 0x00000281BF7F74C0>

  3.日志(模块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(file_name = '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,10000):
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)
logging.error(msg,exc_info = True)
  

  4.项目结构目录

    脚本:

 

 单执行文件:

 

 

多执行文件:

 

posted @ 2020-07-06 10:09  李敏1027  阅读(152)  评论(0)    收藏  举报