python约束 异常 MD5 日志处理
一.约束
1.用父类执行约束
子类继承父类,用重写方法,对子类的方法进行约束.
class Foo: def login(self): # 对子类进行约束,该方法需要重写 # 没有执行的错误 raise NotImplementedError ("login重写") # 抛出 NotImplementedError错误 class Member(Foo): def login(self): print("我是普通登陆") class BaWu(Foo): def login(self): print("我是吧务登陆") class HouTai(Foo): def denglu(self): print("我是后台登陆") def fn(obj): obj.login() m = Member() bw = BaWu() ht = HouTai() fn(m) fn(bw) fn(ht)
2.定义抽象类进行约束
抽象类中的抽象方法不能执行,报错约束
from abc import ABCMeta ,abstractmethod #导入抽象类模块 class Foo(metaclass=ABCMeta): # 定义一个抽象类 元类 @abstractmethod # 定义一个 抽象方法 def login(self):pass def back(self): # 抽象类中可以写正常方法 print("退出登陆") class Member(Foo): def login(self): print("我是普通登陆") class BaWu(Foo): def login(self): print("我是吧务登陆") class HouTai(Foo): def denglu(self): print("我是后台登陆") def fn(obj): obj.login() m = Member() bw = BaWu() ht = HouTai() fn(m) fn(bw) fn(ht) m.back()
抽象类总结:
1.子类必须重写父类的方法,否则子类也是抽象类
2.抽象类不能创建对象
3.有抽象方法的类,就是抽象类
4.抽象类可以有方法
二.异常处理
1.处理异常错误
格式 try...except...
try: # 处理异常 try ... except... print(1/0) except ZeroDivisionError:
print("0不能做除数")
print("hah")
try: print(1/0) except Exception: # 可以处理所有错误,一般在最下面兜底用 print("我能拦截下面吗") except ZeroDivisionError: print("0不能做除数")
格式 try...except...except...else...finally
try: # print(1/0) f = open("dssadas",mode="r") except ZeroDivisionError: print("0不能做除数") except FileNotFoundError: print("找不到文件") except Exception: # 可以处理所有错误,一般在最下面兜底用 print("我能兜底") else: # 当try中的代码不产生任何错误的时候,会自动执行else里的代码 print("没有出错?") # 这里一般放pass finally: # 最终,不管出错还是不出错,都要执行最后的finally print("哈哈哈")
2.自定义异常
因为所有的异常类都继承Exception 所以写一个继承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 抛出 raise 异常类(错误信息) raise CulException("这是自己定义的异常类,抛出") print(cul("sdf",25))
3.查看堆栈
可以查看到具体某一行出错
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 man_zaotang(t): if t.gender == "男": t.xizao() else: raise GenderException("进错了") # 抛出异常很重要 try: p = Person("小明","女") man_zaotang(p) except GenderException: ret = traceback.format_exc() # 查看堆栈信息,看错误信息的 print(ret)
三.MD5加密
导入模块使用,不可逆的一种加密方式
import hashlib def my_md5(s): obj = hashlib.md5(b"dasds") # 加盐 防止被破解 obj.update(s.encode("utf-8")) # 给s字符串加密 return obj.hexdigest() # 获取密文 uname = input("用户名:") upwd = input("密码:") if uname == "admin" and my_md5(upwd) == "f5cb18dbc8aae8b87c9129ff3156e0d5": print("登陆成功") else: print("帐号或者密码错误")
四.日志处理
日志一般不需要更改很多,只需要设置参数,有模板
1.单一日志模板
import logging # 单一项目模块 logging.basicConfig( filename="1.log", # 把日志信息写入的文件名 # 时间 等级名 模块名 写入信息 format="%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s", datefmt="%Y-%m-%d %H:%M:%S", # level=40 # 设置等级 超过这个的都写入日志 ) # 向日志文件写入内容 logging.critical("我几乎是最高等级50") logging.error("我是错误,等级40") logging.warning("我是警告,等级30") logging.info("我是提示,等级20") logging.debug("我是debug,等级10") logging.log(600,"写入内容")
2.多个日志模板
import logging file_handler = logging.FileHandler("2.log","a","utf-8") # 创建日志文件 file_handler.setFormatter( logging.Formatter( # 日志格式 fmt="%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s")) logger1 = logging.Logger("dnf",level=10) # 设置日志处理对象和等级 logger1.addHandler(file_handler) # 把文件添加到日志 logger1.error("看看错误") # 错误信息 file_handler2 = logging.FileHandler("3.log","a","utf-8") file_handler2.setFormatter( logging.Formatter( fmt="%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s" ) ) logger2 = logging.Logger("lol",level=logging.DEBUG) logger2.addHandler(file_handler2) logger2.critical("????") # 哪里需要记录日志就放到哪里,要设置等级