类__约束、异常处理、日志处理、hashlib(加密模块)
一.类的约束.
1.在一个类中如果有一个方法是抽象方法. 那么这个类一定是一个抽象类 2.如果一个类中所有的方法都是抽象方法. 这个类可以被称为接口类 3.抽象类中.如果出现一个抽象方法. 此时这个类就不能实例化对象,而且继承的子类也必须将该类中的抽象方法重新定义完才能实例化.
第一种约束方案:
raise NotImplementedError() #抛出异常
class Base:
# 对子类进行了约束. 必须重写该方法
# 以后上班了. 拿到公司代码之后. 发现了notImplementedError 继承他 直接重写他
def login(self):
# 没有被实现错误
raise NotImplementedError("你要重写一下login这个方法. 否则报错!") # 抛异常 .
class Member(Base):
def login(self):
print("我是普通人登录")
class BaWu(Base):
def login(self):
print("吧务登录")
class Houtai(Base):
def login(self): # 报错, 上层程序员写代码没有按照规范来
print("后台登录")
# 整合这些个功能
def deng(obj):
obj.login()
m = Member()
bw = BaWu()
ht = Houtai()
deng(m)
deng(bw)
deng(ht)
第二种约束方案:
from abc import ABCMeta, abstractmethod # 类中包含了了抽象⽅方法. 那此时这个类就是个抽象类. 注意: 抽象类可以有普通⽅方法
class IGame(metaclass=ABCMeta): # 一个游戏到底怎么玩儿? 你能形容? 流程能一样么?
@abstractmethod
def play(self):
pass
def turn_off(self):
print("破B游戏不不玩了, 脱坑了")
class DNFGame(IGame): # 子类必须实现父类中的抽象方法. 否则子类也是抽象类
def play(self):
print("dnf的玩儿法")
# g = IGame() # 抽象类不不能创建对象
dg = DNFGame()
dg.play()
二、异常处理.
一)自定义异常:随便写一个类. 这个类只要继承了Exception 这个类就是一个异常类就可以作为raise对象(自定义异常,讲究异常的名字要见名知义(从日志看到这个异常名字,知道那个函数\模块出了错)这样,抛出异常,后面的兄弟也好解决.)
class CulException(Exception): #自己定义异常.
pass
# 如何手动抛出异常
def cul(a, b):
# 只能是数字相加
if (type(a) == int or type(a) == float ) and (type(b) == int or type(b) == float):
return a + b
else:
raise CulException("我没办法给你处理这样的运算") # raise 异常类(错误信息)
print(cul("就不放, 气死你",2))
二)如何处理异常:
1)处理异常用: try...except....来处理错误.
2)报错后如何给出错误信息的节点:(错误信息叫堆栈)
查看堆栈信息用: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 xizao(self):
print(f"{self.name}在洗澡")
def nan_zao_tang_zi(ren):
if ren.gender == "男":
ren.xizao()
else:
raise GenderException("性别不对. 去对门看看") # 抛异常是很重要的
try: #处理异常.防止异常溢出给用户
p1 = Person("思密达", "不知道")
p2 = Person("吉祥物", "男")
nan_zao_tang_zi(p1)
nan_zao_tang_zi(p2)
except GenderException:
ret = traceback.format_exc() # 查看堆栈信息, 看错误的
print(ret)
print("出错了. 很可惜")
三)在python里所有的异常的根是Exception, 所有的异常类都会默认继承Exception,关于错误异常的类有
1.FileNotFoundError 文件异常
2.ZeroDivisionError 数字异常
try:
print(1/10)
f = open("哈哈哈哈哈", mode="r")
d = {[]:123}
except ZeroDivisionError: # 可以处理所有错误
print("除以0出错了")
except FileNotFoundError:
print("文件不存在的错误")
except Exception: # 兜底的
print("其他错误")
else: # 当try中的代码不产生任何错误的时候. 会自动的执行else里的代码
pass
finally: # 最终. 不管出错还是不出错. 都要执行最后的finally 一般用来收尾
print("哈哈哈哈哈哈哈哈啊哈")
三、MD5加密.
import hashlib
def my_md5(s): #定义MD5加盐的函数,参数s是要加密的内容.
obj = hashlib.md5(b"fkldsajlkfjlaksd") # 俗称加盐,b的意思是字节,盐定义好后不可随意更改,否则以后无法跟用户输入的值匹配.
obj.update(s.encode("utf-8")) # 把要加密的内容给md5
return obj.hexdigest() #返回的结果就是加密过的
print(my_md5("123456"))
#数据库中存这
username = "wusir"
password = "7f329b79701191ed6489c27676a38eb1"
#登录
uname = input("请输入你的用户名")
upwd = input("请输入你的密码") # 123456
if uname == username and my_md5(upwd) == password:
print("登录成功")
else:
print("登录失败")
# 机器永远不会出错. 出错的只会是人
四、日志.
简易版日志写法(一般小公司够用了):
import logging
# 配置好日志的处理, 默认就是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=40) # 当前配置表示 10以上的分数会被写入日件
# 向日志文件写入内容
logging.critical("今天嫂子没有来") # 50, 几乎是最高的
logging.error("昨天嫂子来了") # 40 平时使用最多的就是他
logging.warn("气死我了") # 30 警告
logging.warning("还好吧")
logging.info("提示") # 20 级
logging.debug("开发的时候把这个开着") # 10
logging.log(999, "宝宝今天有懵逼了")
升级版.
import logging # 创建一个操作日志的对象logger(依赖FileHandler) #c 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('腾讯qq', level=10) # 创建一个日志文件处理的对象 logger1.addHandler(file_handler) # 把文件添加到日志 logger1.error("麻花藤明天请大家吃饭. 去不去?") #往日志里面写入信息 # 再创建⼀个操作日志的对象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('百度贴吧', level=logging.DEBUG) logger2.addHandler(file_handler2) logger2.error("我才不去呢. 我们在北京. 离你那么远")#往日志里面写入信息
举例子:
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 xizao(self):
print(f"{self.name}在洗澡")
class ZaoTang:
def nan(self, ren):
if ren.gender == "男":
ren.xizao()
else:
raise GenderException("我这里要的是男人")
def nv(self, ren):
if ren.gender == "女":
ren.xizao()
else:
#logger1.error("走错屋了.. ") 也可以在定义函数直接设置异常日志
raise GenderException("我这里要的是女人")
try: #尝试
p1 = Person("赵亚磊", "男")
p2 = Person("林志玲", "女")
zaotang = ZaoTang()
zaotang.nan(p2)
zaotang.nv(p1)
except GenderException:
print("走错屋里了")
logger1.error("走错屋了.. ") #往日志里写东西
logger1.error(traceback.format_exc()) # 把堆栈信息记录在日志文件中