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

  • 相关阅读:
    复合文字(C99)
    复浮点数(C99)
    字符串的数组形式与指针形式
    《设计模式之禅》学习笔记(十)
    旧关键字的新位置(C99)
    C的存储类、链接和内存管理
    scanf( )函数的格式化输入
    《设计模式之禅》学习笔记(十三)
    yum软件包管理器
    《设计模式之禅》学习笔记(十五)
  • 原文地址:https://www.cnblogs.com/NATO/p/9983792.html
Copyright © 2011-2022 走看看