小学生绞尽脑汁也学不会的python(异常,约束,MD5加密,日志处理)
异常处理(处理)
1.产生异常.raise 异常类(),抛出异常
2. 处理异常:
try: xxxxx # 尝试执行的代码. except 异常类 as 变量: # 出现错误的时候. 捕获到异常 xxxxxx # 处理异常ch try: """操作""" except Exception as e: """保护的父类,可以捕获所有异常""" else: """保护不抛出异常的代码,当try中无异常的时候执行""" finally: """最后总要执行我""" def chu(a,b): return a/b try: #尝试着运行 ret = chu(10,0) print(ret) except Exception as e: #Exception 表示所有的错误 print("除数不能是0") try: print("各种操作...") except ZeroDivisiongError as e: print("除数不能是0") except FileNotFoundError as e: print("文件不存在") except Exception as e: print("其他错误")
程序先执⾏操作, 然后如果出错了会走except中的代码. 如果不出错, 执⾏else中
# 的代码. 不论处不出错. 最后都要执⾏finally中的语句. ⼀般我们⽤try...except就够⽤了. 顶多
# 加上finally. finally⼀般⽤来作为收尾⼯作.
3. 自定义异常
继承Exception,那这个类就是一个异常类
lass GenderError(Exception): pass class Person: def __init__(self,name,gender): self.name = name self.gender = gender def nan_zao_tang_xi_zao(person): if person.gender != "男": raise GenderError("性别不对,这里是澡堂子") p1 = Person("alex","男") p2 = Person("eggon","蛋") try: nan_zao_tang_xi_zao(p1) nan_zao_tang_xi_zao(p2) except GenderError as e: print(e) except Exceptiong as e: print("反正报错了")
4. 堆栈信息
import traceback
traceback.format_exc() 获取堆栈信息.处理异常:
mport traceback """继承Exceptiong.那个类就是一个异常类""" class GenderError(Exception): pass class Person: def __init__(self,name,gender): self.name = name self.gender = gender def nan_zao_tang_xi_zao(person): if person.gender != "男": raise GenderError("性别不对,这里是男澡堂子") p1 = Person("alex", "男") p2 = Person("eggon", "蛋") """处理异常""" try: nan_zao_tang_xi_zao(p1) nan_zao_tang_xi_zao(p2) except GenderError as e: val = traceback.format_exc() #获取到堆栈信息 print(e) print(val) except Exception as e: print("反正报错了")
************************************************************************************************************
约束(难)
约束是对子类进行的约束。
一。 通过抛异常(简单)
在父类中给出一个方法。 这个方法中什么都不写。 就抛异常。 NotImplementError()
在子类中把上述的方法进行重写。
重写:子类重新定义父类中的方法。
lass Base: def login(self): raise Exception("你没有实现login方法()") class Normal(Base): def login(self): pass class Member(Base): def denglu(self): pass class Admin(Base): def login(self): Pass def login(obj): print("准备验证码...") obj.login() print("进入主页...") n = Normal() m = Member() a = Admin() login(n) login(m) login(a)
二。 抽象类和抽象方法(java, c
# )
接口: 类中都是抽象方法.
from abc import ABCMeta, abstractmethod
抽象方法: 抽象方法不用给出方法体.写个pass就行了
抽象类:
语法:类(metaclass=ABCMeta)
概念: 如果类中包含了抽象方法.这个类一定是抽象类
特点: 抽象类一般不创建对象.
抽象类中可以存在正常方法
可以约束子类必须实现抽象方法
from abc import ABCMeta,abstractmethod class IGame(metaclass=ABCMeta): @abcstractmenthod def piay(self): pass def turn_off(self): print("破几把游戏,") class DNFGame(IGname): def play(delf): print("dnf的玩法") dg = DNFGame() dg.play()
*************************************************************************************************************************
MD5加密
MD5加密:不可逆
引入模块
hashlib
1
创建md5对象
2.
把加密信息交给md5对象
3.
获取密文
mport hashl obj = hashlib.md5() obj.update("alex".encode("utf-8")) # 加密的必须是字节 miwen = obj.hexdigest() print(miwen) # 534b44a19bf18d20b71ecc4eb77c572f import hashlib def my_md5(s): obj = hashlib.md5(b"fjlksajflkjasfsalwer123dfskjf") obj.update(s.encode("utf_8")) return minwen username = input("请输入用户名:") password = input("请输入密码:") if username == "wusir" and my_md5(password) =="99fca4b872fa901aac30c3e952ca786d" print("成功") else: print("失败")
**********************************************************************************************************************************************************
日志处理(重要, 简单)
引入logging模块
简单配置即可(basicConfig 单一日志文件 fileHandler 文件助手可以实现多文件操作)
日志级别:
CRITICAL 最高的
ERRO 40
WARN 30
INFO 20
DEBUG 10
import logging # logging.basicConfig(filename='app.log', # format='%(asctime)s - %(name)s - %(levelname)s - %(module)s: %(message)s', # datefmt='%Y-%m-%d %H:%M:%S', # level=40) # level 设置级别. 当你的信息的级别>=level的时候才会写入日志文件, 默认30 # # # CRITICAL = 50 # # FATAL = CRITICAL # # ERROR = 40 # # WARNING = 30 # # WARN = WARNING # # INFO = 20 # # DEBUG = 10 # # NOTSET = 0 # # 写日志 # # logging.critical("我是critical") # # logging.error("我是error") # # logging.warning("我是警告") # # logging.info("我是基本信息") # # logging.debug("我是调试") # # logging.log(2, "我是自定义") # import traceback # # for i in range(20): # try: # if i % 3 == 0: # raise FileNotFoundError("我是FileNotFountException") # elif i % 3 == 1: # raise StopIteration() # elif i % 3 == 2: # raise KeyError() # # except FileNotFoundError as e: # val = traceback.format_exc() # logging.error(val) # except StopIteration as e: # val = traceback.format_exc() # logging.error(val) # except KeyError as e: # val = traceback.format_exc() # logging.error(val) # except Exception as e: # val = traceback.format_exc() # logging.error(val) # 多文件日志处理 # 创建⼀个操作⽇志的对象logger(依赖FileHandler) file_handler = logging.FileHandler('l1.log', 'a', encoding='utf-8') # 设置日志文件内容的格式 file_handler.setFormatter(logging.Formatter(fmt="%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s")) logger1 = logging.Logger('A', level=40) logger1.addHandler(file_handler) # 记录日志 logger1.error('我是A系统') # 再创建⼀个操作⽇志的对象logger(依赖FileHandler) file_handler2 = logging.FileHandler('l2.log', 'a', encoding='utf-8') file_handler2.setFormatter(logging.Formatter(fmt="%(asctime)s - %(name)s -%(levelname)s -%(module)s: %(message)s")) logger2 = logging.Logger('B', level=40) logger2.addHandler(file_handler2) # 记录日志 logger2.error('我是B系统')