• pyrhon类约束及异常处理和日志模块


    类的约束

    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: 我这里要的是男人
  • 相关阅读:
    Mishka and Interesting sum
    Tree Restoring
    LIB 配置文件读写器
    WCF 采用net.tcp协议实践
    MVC ViewEngineResult实际上是一种设计
    MVC 依赖注入扩展
    功能权限设计
    代理上网荟萃
    MD5算法 简介
    MVC _ViewStart文件的作用
  • 原文地址:https://www.cnblogs.com/wangm-0824/p/10199639.html
Copyright © 2020-2023  润新知