zoukankan      html  css  js  c++  java
  • Python 18 约束和异常处理

    约束和异常

    1.类的约束

    1. 提取父类. 然后在子类中定义好方法. 在这个方法中什么都不用干. 就抛一个异
      常就可以了. 这样所有的子类都必须重写这个方法. 否则. 访问的时候就会报错
    2. 使用元类来描述父类. 在元类中给出一个抽象⽅法. 这样子类就不得不给出抽象
      方法的具体实现. 也可以起到约束的效果.

    方法一 ↓↓↓

    def login(self):
     raise Exception("你没有实现login⽅法()")
    class Normal(Base):
     def login(self):
     	pass
    class Member(Base):
     	def denglu(self):
     		pass
    class Admin(Base):
     def login(self):
     	pass
     # 项目经理写的总入口
    def login(obj):
     print("准备启动程序.......")
        obj.login()
     print("进入主程序.......")
    n = Normal()
    m = Member()
    a = Admin()
    login(n)
    login(m) # 报错. 
    login(a)
    

    方法二 ↓↓↓
    写抽象类和抽象方法.
    需要引入abc模块中的 ABCMeta 和 abstractmethod

    from abc import ABCMeta, abstractmethod
    class Base(metaclass=ABCMeta):
      @abstractmethod
      def login(self):
      pass
    class Normal(Base):
      def loin(self):
      pass
    class Member(Base):
     def denglu(self): # 这个就没用了
     pass
     def login(self): # 子类对父类进行实现
     pass
    class Admin(Base):
     def login(self):
     pass  
    def login(obj):
     print("准备进入程序.......")
     obj.login()
     print("进入主程序.......")
    n = Normal()
    m = Member()
    a = Admin()
    login(n)
    login(m)
    login(a) 
    

    1). 使用抽象类和抽象方法, 由于该方案来源是java和c#. 所以使用频率还是很少的

    2). 使用人为抛出异常的方案. 并且尽量抛出的是NotImplementError. 这样比较专

    业, 而且错误比较明确.(推荐)

    2.异常处理

    def num():
        return a/b
    rt = num(2,0)
    print(rt)    #  直接报错
    

    上面就直接报错了,除数不能是0

    def num():
        return a/b
    try:
        rt = num(2,0)
        print(rt)
    except Exception as e:
        print("除数不能是0")
    

    直接将报错结果变成 除数不能是0
    用 try 和 except拦截异常,并将异常对象抛给e

    3.自定义异常

    只要你的类继承了Exception类. 那你的类就是一个异常类.

    class GenderError(Exception):
        pass
    class Person:
        def __init__(self, name, gender):
            self.name = name
            self.gender = gender
    def nan_zao_tang_xi_zao(person):
        if person.gender != "男":
            raise GenderError("性别不对. 这里是男澡堂子")	
    p1 = Person("alex", "男")
    p2 = Person("eggon", "蛋")
    # nan_zao_tang_xi_zao(p1)
    # nan_zao_tang_xi_zao(p2) # 报错. 会抛出一个异常: GenderError
    # 处理异常
    try:
        nan_zao_tang_xi_zao(p1)
        nan_zao_tang_xi_zao(p2)
    except GenderError as e:
        print(e) # 性别不对, 这⾥是男澡堂⼦
    except Exception as e:
        print("反正报错了")
    

    4.MD5加密

    MD5是一种不可逆的加密算法. 它是可靠的. 并且安全的. 在python中我们不需要手写
    这套算法. 只需要引入一个叫hashlib的模块就能搞定MD5的加密工作

    import hashlib
    obj = hashlib.md5()
    obj.update("alex".encode("utf-8")) # 加密的必须是字节
    miwen = obj.hexdigest()
    print(miwen) # 534b44a19bf18d20b71ecc4eb77c572f
    

    可是上面这样的加密是不安全的, 很容易会产生撞库
    看下面

    import hashlib
    obj = hashlib.md5(b"fjlksajflkjasfsalwer123dfskjf") # 加入这些就安全了
    obj.update("alex".encode("utf-8")) # 加密的必须是字节
    miwen = obj.hexdigest()
    print(miwen) # 99fca4b872fa901aac30c3e952ca786d
    

    加密的应用

    import hashlib
    def my_md5(s):
        obj = hashlib.md5(b"fjlksajflkjasfsalwer123dfskjf")
        obj.update(s.encode("utf-8")) # 加密的必须是字节
        miwen = obj.hexdigest()
        return miwen
    username = input("请输入用户名:")
    password = input("请输入密码:")	
    if username == "wusir" and my_md5(password) =="99fca4b872fa901aac30c3e952ca786d":
        print("成功")
    else:
        print("失败")
    

    5.日志

    1. 导入logging模块.
    2. 简单配置一下logging
    3. 出现异常的时候(except). 向日志里写错误信息.
    logging.basicConfig(filename='x1.txt',
     format='%(asctime)s - %(name)s - %(levelname)s -%
    (module)s: %(message)s',
     datefmt='%Y-%m-%d %H:%M:%S',
    level=0) # 当前配置表示 10以上的分数会被写入文件
    logging.critical("我是critical") # 50分. 最贵的
    logging.error("我是error") # 40分
    logging.warning("我是警告") # 警告 30
    logging.info("我是基本信息") # 20
    logging.debug("我是调试") # 10
    logging.log(2, "我是自定义") # 自定义. 看着给分
    

    CRITICAL = 50
    FATAL = CRITICAL
    ERROR = 40
    WARNING = 30
    WARN = WARNING
    INFO = 20
    DEBUG = 10
    NOTSET = 0

  • 相关阅读:
    ASP.NET Web API 控制器执行过程(一)
    ASP.NET Web API 控制器创建过程(二)
    ASP.NET Web API 控制器创建过程(一)
    ASP.NET Web API WebHost宿主环境中管道、路由
    ASP.NET Web API Selfhost宿主环境中管道、路由
    ASP.NET Web API 管道模型
    ASP.NET Web API 路由对象介绍
    ASP.NET Web API 开篇示例介绍
    ASP.NET MVC 视图(五)
    ASP.NET MVC 视图(四)
  • 原文地址:https://www.cnblogs.com/NATO/p/9983792.html
Copyright © 2011-2022 走看看