zoukankan      html  css  js  c++  java
  • python--类的约束,异常处理,MD5加密,日志处理logging模块

    1.类的约束

    在开发中,如果项目经理需要对类进行约束,可以有两种方式

    1. 对子类进行约束

     Base:
        #对子类进行约束,必须重写这个方法
        # 在工作中发现了NotImplementedError之后,继承并重写这个方法
        def login(self):
            raise NotImplementedError
    
    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(
    

      

    2.采用抽象类和抽象方法来进行约束,这个方式来源与java与c#

    1.抽象方法不需要给出具体的方法体.抽象方法内只写一个pass就可以了

    2.在一个类中如果有一个方法是抽象方法,那么这个类一定是一个抽象类

    3.抽象类中,如果有抽象方法.此时这个类不能被创建对象

    4.如果一个类中所有的方法都是抽象方法.这个类可以被称为接口类

    #写一个抽象方法:导入一个模块
    from abc import ABCMeta, abstractmethod
    
    #此时抽象类不能被创建对象
    class Animal(metaclass = ABCMeta):  # 写完这里,就是一个抽象类
        @abstractmethod # 抽象方法
        def chi(self):  # 吃应该只是一个抽象概念.没办法完美描述出来吃什么
            pass
    
        #抽象类中可以有正常的方法
        def dong(self):
            print("动物会动")
    #class Cat(Animal):  # 如果没有被注释的时候, Cat里面也有一个抽象方法,这时是创建不了对象的
    #  pass
    class Cat(Animal): def chi(self): print("猫喜欢吃鱼") a = Cat() a.chi() a.dong()

      

    2. 异常处理. 

    举个例子:

    print(1/0) # 报错 ZeroDivisionError: division by zero

    0不能作除数,这时就会报错,系统就会抛出这个异常,如果没有人处理,错误就会继续下去传给用户

    处理异常: 通过try...except ...来处理错误

    try:
        print(1 / 0)
    except Exception:
        print("出错了, 出现了ZeroDivisionError")
    print("哈哈哈哈哈哈哈") # 可以正常运行.
    

      

    下面是try..except..的一般写法,所有异常的根是Excepiton,所有的异常类都会默认继承Exception

    try:
        代码
    except 异常类:
        处理异常
    except 异常类:
        处理异常
    except 异常类:
        处理异常
    else:
        当程序不出错,执行这里
    finally:
        不管出不出错,都要执行

     

    自己定义异常: 随便写一个类,这个类只要继承了Exception 这个类就是一个异常类,就可以作为raise对象

    class 类(Exception):
        pass

      

    这里我们举一个例子,比如一个男浴池只能男人进

    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("出错了. 很可惜")
    
    # 错误信息叫堆栈信息
    

      

    3.MD5加密

    总结的用法

    import hashlib
    
    obj = hashlib.md5(b'盐')
    obj.update(b"要加密的内容")
    print(obj.hexdigest())
    

      

    在用户登陆设计时,有时不希望一些维护人员等能够直接看到登陆名和密码,这是我们可以采用MD5来加密内容,而且这种加密是不可逆的

    使用这个功能需要引入一个hashlib模块

    import hashlib
    obj = hashlib.md5()
    obj.update("yonghuming".encode())  # 加密必须是字节
    miwen = obj.hexdigest()
    print(miwen)  # c1e396b02e499cf86298b6c486d43db7
    

     

    这样的加密其实并不安全.当我们用这样的密文去CMD5网站撞库查询时,是有很大几率能解密成功的

    为了解决这个问题,在使用MD5的时候,给函数的参数传递一个byte即可

    import hashlib
    obj = hashlib.md5(b"alaieur") # 这里的功能是 加盐 obj.update("yonghuming".encode()) # 加密必须是字节 miwen = obj.hexdigest() print(miwen) # b9143a2edaf392b18a8650853290ef7a

      这样就无法解密了

    举个MD5的应用例子

    # 我自己的MD5功能
    def my_md5(s):
    obj = hashlib.md5(b"fkldsajlkfjlaksdjfkladsjfkladsjkldsjfklfjs") # 加盐
    obj.update(s.encode("utf-8")) # 把要加密的内容给md5
    return obj.hexdigest()
    
    #应用 username = "wusir" password = "3e29aa0dc8a38b43c3479566cafc3cbe" # 登录 uname = input("请输入你的用户名") upwd = input("请输入你的密码") # 123456 if uname == username and my_md5(upwd) == password: print("登录成功") else: print("登录失败")

      

      

    4.日志处理

      编写软件时,多少都会出现一些bug.这些问题或者bug一般都会在测试的时候给处理掉,但是多少都会出现一些意想不到的错误,这个时候,我们不知道哪里出了问题,因为很多Bug不是必现的,所以我们需要在python中创建一套日志系统,来帮助我们更好的发现错误来源

    处理的流程是这样:

      1.导入logging模块

      2.简单配置一下logging

      3.出现异常的时候(except).向日志里写错误信息.

    这是第一种日志处理方式

    import logging
    
    filename: 文件名
    format: 数据的格式化输出. 最终在日志文件中的样子
             时间-名称-级别-模块
    datefmt: 时间的格式
    level: 错误的级别权重,当错误的级别权重大于等于leval的时候才会写入文件
    
    # 配置好日志的处理, 默认就是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以上的分数会被写入日件
    
    #日志处理级别
     critical = 50
     fatal = critical
     error = 40
     warn = warning
     warning = 30
     info = 20
     debug = 10 
     notset = 0
    
    # 向日志文件写入内容
    logging.critical("最高级50") # 50, 几乎是最高的
    logging.error("错误等级40") # 40 平时使用最多的就是他
    logging.warn("警告级别30") # 30  警告
    logging.warning("还好吧")
    logging.info("提示20") # 20 级
    logging.debug("开发的时候把这个开着,级别为10") # 10
    logging.log(999, "最低级为0")
     

      最后, 如果你系统中想要把日志文件分开. 比如. 一个大项目, 有两个子系统, 那两个子系统要分开记录日志. 方便调试. 那怎么办

    呢? 注意. 用上面的basicConfig是搞不定的.

    要借助文件助手(FileHandler), 来帮我们完成日志的分开记录. 我们来看看第二种处理日志的方式,用来记录到不同的日志文件

    import  logging
    
    #创建一个操作日志的对象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("腾讯qq",level = 10)  # 创建一个日志文件处理对象
    logger1.addHandler(file_handler)  # 把文件添加到日志
    
    logger1.error(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  logging
    
    #创建一个操作日志的对象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("腾讯qq",level = 10)  # 创建一个日志文件处理对象
    logger1.addHandler(file_handler)  # 把文件添加到日志
    logger1.error(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("我这里要的是男人")
    try:
        p1 = Person("小名","男")
        p2 = Person("小红","女")
        zaotang = ZaoTang()
        zaotang.nan(p2)
    
    except GenderException:
        print("走错屋里了")
        logger1.error("走错屋了")
        logger1.error(traceback.format_exc()) # 把堆栈信息记录在日志文件中
    

      

     

  • 相关阅读:
    ccache: error: Failed to ctreate temporary file for esp-idf/..../pwhash_scryptsalsa208sha256_nosse.c.obj: No Such file or directory
    electron+vue-cli3 打包报错 “Application entry file "background.js" does not exist”
    给按钮加loading效果
    java 的 try catch
    mac 的jmeter启动命令
    json转java对象 和 java对象转json 的方法 (一个类renturn的数据 映射到另外一个类接收)
    springboot 待学习的东西
    csv
    vue-cli 出现导航重复解决方法
    vue json展示组件
  • 原文地址:https://www.cnblogs.com/robertx/p/10156440.html
Copyright © 2011-2022 走看看