python 约束. 异常处理. MD5. 日志处理
一.约束
1.抛异常
1 # # 项目经理写的 2 class Base: 3 # # 对子类进行了约束. 必须重写该方法 4 # # 以后上班了. 拿到公司代码之后. 发现了NotImplementedError 继承他, 直接重写他 5 def login(self): 6 raise NotImplementedError("你要重写一下longin这个方法. 否则报错!") # 抛异常 7 # 8 # # 自己写的 9 class Member(Base): 10 def login(self): 11 print('我是普通人登录') 12 13 class BaWu(Base): 14 def login(self): 15 print('吧务登录') 16 17 class Houtai(Base): 18 # def denglu(self): # 报错, 上层程序员写代码没有按照规范来 # NotImplementedError: 你要重写一下longin这个方法. 否则报错! 19 # print('后台登录') 20 21 def login(self): # 正确版 # 把上面的denglu 改成 login 才是正确的不会报错 22 print('后台登录')
2.抽象类和抽象方法
1 # 抽象方法不需要给出具体的方法体. 抽象方法内只写一个pass就可以了 2 # 在一个类中如果一个方法是抽象方法. 那么这个类一定是一个抽象类 3 # 抽象类中. 如果有抽象方法. 此时这个类不能创建对象 4 # 如果一个类中所有的方法都是抽象方法. 这个类可以被称为接口类 5 6 # 写一个抽象方法: 导入一个模块 7 from abc import ABCMeta,abstractmethod 8 9 # 此时抽象类不能创建对象 10 class Animal(metaclass= ABCMeta): # 写完这个东西. 就是个抽象类 11 12 @abstractmethod 13 def chi(self): 14 pass 15 16 # 抽象类中可以有正常的方法 17 def dong(self): 18 print('动物会动') 19 20 # class cat(Animal): #此时猫里面也有一个抽象方法, 此时的猫是创建不了对象的 21 # pass 22 23 class cat(Animal): 24 def chi(self): # 重写父类中的抽象方法 25 print('猫喜欢吃鱼') 26 27 c =cat() 28 c.chi() 29 c.dong()
二.异常处理
try: print(1/10) f = open('哈哈哈哈',mode='r') d = {[]:123} except ZeroDivisionError: print('除以0出错了') except FileNotFoundError: # 处理完错误后就不往下走了 print('文件不存在的错误') except Exception: # 兜底的 能处理所有错误 print('其他错误') else: # 当try中的代码不产生任何错误的时候. 会自动的执行else里的代码 基本没什么用 都直接写try里了 pass finally: # 最终. 不管出错还是不出错. 都要执行最后的finally 一般用来收尾 以后数据连接还有各种连接用来断开连接用 print('哈哈哈哈哈')
如何自己定义异常
随便写一个类. 这个类只要继承了Exception 这个类就是一个异常类就可以作为raise对象
1 class CulException(Exception): 2 pass 3 4 5 # 如何手动抛出异常 6 def cul(a,b): 7 # 只能是数字相加 8 if (type(a) == int or type(a) == float) and (type(b) == int or type(b) == float): 9 return a + b 10 11 else: 12 # 抛出异常 13 # raise 异常类(错误信息) 14 raise CulException('我没有办法给你处理这样的运算') 15 16 print(cul('就是不放',2))
三.MD5
1 import hashlib 2 3 # md5对象 4 5 obj = hashlib.md5(b'qweqws') # 加盐 6 obj.update('123456'.encode('utf-8')) # 把要加密的内容给Md5 7 print(obj.hexdigest()) # 拿到密文 d2a43a16b3a92a620c4a769ed2d7b45c
四.日志处理
(1)单个日志
1 import logging 2 3 # 4 # 配置好日志的处理, 默认就是GBK 5 logging.basicConfig(filename='x1.txt', # 把日志信息写入的文件名 6 format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s', 7 datefmt='%Y-%m-%d %H:%M:%S', # 时间的格式 8 level=10) # 当前配置表示 10以上的分数会被写入日件 9 10 # 向日志文件写内容 11 logging.critical('今天嫂子没有来') # 50, 几乎是最高的 level = 50 12 logging.error('昨天嫂子来了') # 40 平时使用最多的就是他 13 logging.warning('还好吧') # 30 警告 14 logging.info('提示') # 20 提示 15 logging.debug('开发的时候把这个开着') # 10 16 logging.log(999, '宝宝今天又懵逼了') # 999 是自定义的等级 后面的是内容
(2)多个日志
1 import logging 2 3 4 # 创建一个操作日志的对象logger(依赖FileHandler) 5 file_handler = logging.FileHandler('l1.log', 'a', encoding='utf-8') # 创建文件 6 file_handler.setFormatter(logging.Formatter( 7 fmt="%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s")) # 设置日志文件的格式 8 logger1 = logging.Logger('腾讯qq', level=10) # 创建一个日志文件处理对象 9 logger1.addHandler(file_handler) 10 11 logger1.error("麻花藤明天请大家吃饭. 去不去?") 12 13 14 # # 再创建⼀个操作⽇志的对象logger(依赖FileHandler) 15 # file_handler2 = logging.FileHandler('l2.log', 'a', encoding='utf-8') 16 # file_handler2.setFormatter(logging.Formatter( 17 # fmt="%(asctime)s - %(name)s -%(levelname)s -%(module)s: %(message)s")) 18 # logger2 = logging.Logger('百度贴吧', level=logging.DEBUG) 19 # logger2.addHandler(file_handler2) 20 # 21 # logger2.error("我才不去呢. 我们在北京. 离你那么远")