zoukankan      html  css  js  c++  java
  • 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("????")     # 哪里需要记录日志就放到哪里,要设置等级
  • 相关阅读:
    Nginx配置文件详解
    ngrinder 负载均衡脚本开发
    spring boot过滤器FilterRegistrationBean
    Spring boot 拦截器和过滤器
    spring controller中默认转发、forward转发、redirect转发之间的区别
    @RestControllerAdvice作用及原理
    Android APK脱壳--腾讯乐固、360加固一键脱壳
    java 简单xor加密
    facebook 研究
    阿里云docker安装
  • 原文地址:https://www.cnblogs.com/q767498226/p/10158644.html
Copyright © 2011-2022 走看看