• 类__约束、异常处理、日志处理、hashlib(加密模块)


    一.类的约束。

    二、异常处理.

    三、MD5的加密。

    四、日志。

    一.类的约束.

    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()) # 把堆栈信息记录在日志文件中
  • 相关阅读:
    VxWorks 6.9 内核编程指导之读书笔记 -- POSIX
    VxWorks 6.9 内核编程指导之读书笔记 -- ISRs和Watchdog Timer
    VxWorks 6.9 内核编程指导之读书笔记 -- Singnals
    VxWorks 6.9 内核编程指导之读书笔记 -- 多任务
    VxWorks 6.9 内核编程指导之读书笔记 -- 多任务(二)
    VxWorks 6.9 内核编程指导之读书笔记 -- C++开发
    VxWorks 6.9 内核编程指导之读书笔记 -- VxWorks Kernel application (二)
    VxWorks 6.9 内核编程指导之读书笔记 -- VxWorks kernel application (一)
    发布ASP(非.Net)网站
    解决方法:An error occurred on the server when processing the URL. Please contact the system administrator
  • 原文地址:https://www.cnblogs.com/lgw1171435560/p/10157235.html
Copyright © 2020-2023  润新知