类的约束
class Base: #对子类进行了约束,必须重写该方法 def login(self): print('方法错误,必须用定义login方法') # 发现了notImplementedError继承他,直接重写他 # raise NotImplementedError("你要重写一下login这个方法,否则报错!") # 抛异常 class Member(Base): def login(self): print('我的功能是普通用户登录') class Admin(Base): def login(self): print('我的功能是版主登录') class Houtai(Base): # def denglu(self): #报错,上层程序员写代码没有按照规范来 # print('我的功能是管理员登录') def login(self): print('我的功能是管理员登录') def Deng(obj): # 整合这些个功能 obj.login() m = Member() admin = Admin() ht = Houtai() Deng(m) Deng(admin) Deng(ht) 结果 我的功能是普通用户登录 我的功能是版主登录 我的功能是管理员登录
抽象类和抽象方法
抽象方法不需要给出具体的方法体,抽象方法内只写一个pass就可以了
在一个类中如果有一个方法是抽象方法,那么这个类一定是一个抽象类
抽象类中,如果有抽象方法,此时这个类不能创建对象
如果一个类中所有的方法都是抽象方法,这个类可以被称为接口类
写一个抽象方法:
导入一个模块
from abc import ABCMeta,abstractmethod class Animal(metaclass=ABCMeta): #就是个抽象类 @abstractmethod def chi(self): # 吃只是一个抽象概念,没办法完美的描述出来吃什么东西 pass def he(self): # 抽象类中可以有正常的方法 print('喝水') class Cat(Animal): # 此时Cat里面也有一个抽象方法,此时的Cat是创建不了对象的 pass class Dog(Animal): def chi(self): # 重写父类中的抽象方法 print('狗吃肉') # c = Cat() # c.chi() #TypeError: Can't instantiate abstract class Cat with abstract methods chi d = Dog() d.chi() 结果 狗吃肉
MD5加密
import hashlib obj = hashlib.md5(b'盐') #盐又称杂质,通常密码中添加,虽然MD5不可逆推,但是不加盐可以撞库算出密码 obj.update('密码'.encode('utf-8')) print(obj.hexdigest()) 结果 一串MD5数字 案例 import hashlib #定义自己的MD5功能 def my_md5(s): obj = hashlib.md5(b'zazhi') # 加盐 obj.update(s.encode('utf-8')) #把要加密的内容给md5 return obj.hexdigest() print(my_md5('123456')) user = 'bob' pwd = 'abf6a5b33687f111e79f615a6d1fb76a' #登录 uname = input('用户名:') upwd = input('密码:') if uname == user and my_md5(upwd) == pwd: print('登录成功') else: print('登录失败')
异常处理
print(1 / 0) print('哈哈哈哈哈') 结果 ZeroDivisionError: division by zero # 0不能做除数,在程序执行的时候产生了一个错误 # 系统会抛出这个错误,如果没有人处理,错误就会显示给用户 单行异常处理 try: print(1/0) except ZeroDivisionError: print('报错ZeroDivisionError') 结果 报错ZeroDivisionError
多行异常处理
如果在异常处理的时候,其中一个报错类型触发,其他的报错类型就不会触发,处理完触发的报错后自动退出
try: print(1/10) f = open('','r') dic = {[]:123} except ZeroDivisionError: #处理ZeroDivisionError类型错误 print('报错ZeroDivisionError') except FileNotFoundError: #处理FileNotFoundError类型错误 print('报错FileNotFoundError') except Exception: # 可以处理所有错误 print('其他所有类型错误') else: # 当try中的代码不产生任何错误的时候,会自动的执行else里的代码 print('没有错误时候执行这句话') finally: # 最终,不管出错还是不出错,都要执行最后的finally,一般用来收尾 print('无论有没有错误都执行') 结果 0.1 报错FileNotFoundError 无论有没有错误都执行
自定义异常
class 类(Exception):
pass
随便写一个类,这个类只要继承了Exception这个类就是一个异常类就可以作为raise对象
抛出异常
raise 异常类(错误信息)
class TextException(Exception): #自定义异常 pass def Text(a,b): if (type(a) == int or type(a) == float ) and (type(b) == int or type(b) == float): return a + b else: raise TextException('Text函数错误') #raise 抛出异常 print(Text('哈哈',2)) 结果 Traceback (most recent call last): File "E:/Py3Practise/day01/test.py", line 11, in <module> print(Text('哈哈',2)) File "E:/Py3Practise/day01/test.py", line 10, in Text raise TextException('Text函数错误') __main__.TextException: Text函数错误
堆栈
import traceback
traceback.format_exc()
import traceback # 用来查看堆栈信息(错误信息叫堆栈信息) class GenderException(Exception): pass class Person: def __init__(self,name,gender): self.name = name self.gender = gender def xz(self): print(f'{self.name}在洗澡') def nan(ren): if ren.gender == '男': ren.xz() else: raise GenderException('男女有别') # 抛异常是很重要的 try: p1 = Person('bob','不详') p2 = Person('jack','男') nan(p1) nan(p2) except GenderException: ret = traceback.format_exc() # 查看堆栈信息,看错误的 print(ret) # print('报错了') #自定义堆栈信息 结果 Traceback (most recent call last): File "E:/Py3Practise/day01/test.py", line 20, in <module> nan(p1) File "E:/Py3Practise/day01/test.py", line 16, in nan raise GenderException('男女有别') GenderException: 男女有别
日志处理
import logging
日志等级:
critical: 50
error: 40
warning: 30
info: 20
debug: 10
记录日志初级版本 配置好日志的处理,默认就是GBK logging.basicConfig(filename='x1.txt', # 把日志信息写入的文件名 format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s', datefmt='%Y-%m-%d %H:%M:%S', # 时间的格式 level=30) # 当前配置表示 30及以上的日志信息会被写入日志文件,30以下的不记录 # 向日志文件写入内容 logging.critical("系统要爆炸") # 50 几乎是最高的 logging.error("服务程序宕机") # 40 平时使用最多的就是他 logging.warn("服务发生了一个警告") # 30 警告 logging.warning("和warn一样发生了一个警告") logging.info("提示信息") # 20 提示信息 logging.debug("调试信息开发要开着") # 10 详细执行信息 logging.log(999, "自定义了一个日志级别") 日志格式 2018-12-21 19:52:53 - root - CRITICAL -test: 系统要爆炸 2018-12-21 19:52:53 - root - ERROR -test: 服务程序宕机 2018-12-21 19:52:53 - root - WARNING -test: 服务发生了一个警告 2018-12-21 19:52:53 - root - WARNING -test: 和warn一样发生了一个警告 2018-12-21 19:52:53 - root - INFO -test: 提示信息 2018-12-21 19:52:53 - root - DEBUG -test: 调试信息开发要开着 2018-12-21 19:52:53 - root - Level 999 -test: 自定义了一个日志级别
创建一个操作日志的对象logger(依赖FileHandler)
import logging file_handler = logging.FileHandler('test.log', 'a', encoding='utf-8') # 创建文件 file_handler.setFormatter(logging.Formatter( fmt="%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s")) # 设置日志文件的格式 logger1 = logging.Logger('测试程序CRM系统', level=10) # 创建一个日志文件处理对象 logger1.addHandler(file_handler) # 把文件添加到日志 logger1.error("这是测试程序CRM系统调试debug日志") 日志格式 2018-12-21 20:03:09,148 - 测试程序CRM系统 - ERROR -test: 这是测试程序CRM系统调试debug日志 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('自动化系统', level=logging.DEBUG) logger2.addHandler(file_handler2) logger2.error("这个自动化系统调试DEBUG日志") 日志格式 2018-12-21 20:03:09,148 - 自动化系统 -ERROR -test: 这个自动化系统调试DEBUG日志 事例 import logging file_handler = logging.FileHandler('test.log', 'a', encoding='utf-8') # 创建文件 file_handler.setFormatter(logging.Formatter( fmt="%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s")) # 设置日志文件的格式 logger1 = logging.Logger('测试程序CRM系统', level=10) # 创建一个日志文件处理对象 logger1.addHandler(file_handler) # 把文件添加到日志 logger1.error("这是测试程序CRM系统调试debug日志") 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('自动化系统', level=logging.DEBUG) logger2.addHandler(file_handler2) logger2.error("这个自动化系统调试DEBUG日志") import traceback class GenderException(Exception): pass class Person: def __init__(self,name,gender): self.name = name self.gender = gender logger1.info(f'姓名{self.name},性别{self.gender}') def xz(self): print(f'{self.name}在洗澡') class Zt: def nan(self,ren): if ren.gender == '男': ren.xz() else: raise GenderException("我这里要的是男人") def nv(self,ren): if ren.gender == '女': ren.xz() else: raise GenderException("我这里要的是女人") try: p1 = Person('jack','男') p2 = Person('bob','女') zaotang = Zt() zaotang.nan(p2) zaotang.nv(p1) except GenderException: print('走错了') logger1.error('走错屋了') logger1.error(traceback.format_exc()) 结果 走错了 日志结果 2018-12-21 20:25:48,478 - 测试程序CRM系统 - ERROR -test: 这是测试程序CRM系统调试debug日志 2018-12-21 20:25:48,478 - 测试程序CRM系统 - INFO -test: 姓名jack,性别男 2018-12-21 20:25:48,478 - 测试程序CRM系统 - INFO -test: 姓名bob,性别女 2018-12-21 20:25:48,479 - 测试程序CRM系统 - ERROR -test: 走错屋了 2018-12-21 20:25:48,479 - 测试程序CRM系统 - ERROR -test: Traceback (most recent call last): File "E:/Py3Practise/day01/test.py", line 46, in <module> zaotang.nan(p2) File "E:/Py3Practise/day01/test.py", line 35, in nan raise GenderException("我这里要的是男人") GenderException: 我这里要的是男人