zoukankan      html  css  js  c++  java
  • Day-18 面向对象05 约束、异常处理、日志处理

    一、约束

      1.抛出异常

    # 项目经理(级别高一点儿)
    class Base:
        def login(self): # 强制子类做xxxx事
            raise NotImplementedError("子类没有实现该方法") # 报错. 抛异常
    
    # 1. 普通账号  -->  翔哥
    class Normal(Base):
        def login(self):
            print("普通账号的登录")
    
    # 2. 吧务  - > 强哥
    class Member(Base):
        def login(self):
            print("吧务的登录")
    
    # 3. 百度员工  -> 明哥
    class Admin(Base):
        def login(self): # 方法的覆盖和重写
            print("管理员的登录")
    
    # 项目经理
    def wodetian(obj):
        obj.login()
    
    n = Normal()
    wodetian(n)
    
    m = Member()
    wodetian(m)
    
    a = Admin()
    wodetian(a)
    
    抛出异常应用

      2.抽象类

       在python中可以写出抽象类和抽象方法来约束子类

    from abc import ABCMeta, abstractmethod
    #贴吧
    #项目经理(级别高一点儿)
    class Base(metaclass=ABCMeta): # 抽象类
        # 抽象方法
        @abstractmethod # staticmethod, classmethod
        def login(self): # 强制子类做xxxx事
            pass
    
        def hehe(self): # 抽象类中可以有正常的方法
            print("我会呵呵呵")
    
    # b = Base() # 报错的. 原因是Base是一个抽象类. 含有抽象方法. 不允许创建对象的
    
    # 一个类如果全部都是抽象方法. 这个类可以被称为接口. 用来约束子类和规范子类
    
    # 1. 普通账号  -->  翔哥
    class Normal(Base):
        pass
        # def login(self): # 重写了父类中的抽象方法
        #     print("普通账号的登录")
    
    n = Normal()
    
    抽象类应用

      语法:

    from abc import ABCMeta, abstractmethod
    
    class Base(metaclass = ABCMeta):    抽象类
    
           @abstractmethod
           def 方法(self):pass
    
    class Foo(Base):  子类必须重写父类中的抽象方法
           def 方法(self):
                 pass

      一个类包含类抽象方法,这个类一定是抽象类

      抽象类中可以有正常的方法

      抽象类中如果有抽象方法,这个类将不能创建对象

      接口:接口中所有的方法都是抽象方法

      子类必须重写父类中的抽象方法,否则子类也是一个抽象类

    二、异常处理

    try:
        xxxx
    except 错误名称 as 别名:
        出现错误的时候. 要干什么...
    except 错误名称 as 别名:
        出现错误的是偶. 要干什么
    ....
    except Exception as e: # 所有错误的根
        出现的所有的错误. 我都可以这样处理
    else: # 很少用到
        不出错的时候执行这里的代码
    finally:
        结束. 收尾工作

     

    try:
        print(1/0) #  0不能做除数   ZeroDivisionError: division by zero
    except ZeroDivisionError as z:
        print("错了. 除数不能为0")

            由python解释器来调用代码,出现了错误,系统会自动的产生一个叫异常的对象

      系统会尝试着把从错误返回给调用方,过程被称为:抛异常

      我们通过try...except 可以把系统产生的这个错误获取到,过程叫捕获异常

    import traceback
    # 计算a+b
    def cul(a, b):
        if (type(a) == int or type(a) == float) and (type(b) == int or type(b) == float):
            return a + b
        else:
            # 在这里有两种方案. 1. 直接返回 , 2. 抛出异常
            # raise 抛出 Exception 错误和异常,所有错误的根
            raise Exception("我要的不是这个. 你应该我传递int或者float")
    
    
    try:
        print(cul(1, "胡辣汤")) # 加上异常的处理
    except Exception as e:
        # 获取到错误信息. 我们需要访问堆栈信息
        print(traceback.format_exc()) # 获取堆栈信息
        print("出现了错误")
    
    获取堆栈信息

      自定义异常:

    class GenderException(Exception):
        pass
    
    class Person:
        def __init__(self, name, gender):
            self.name = name
            self.gender = gender
    
        #  洗澡 -> 男的进男浴室
        def goto_nan_yushi(self):
            if self.gender != "":
                raise GenderException("性别不对") # 除了名字以外都是父类中的Exception
            else:
                print("欢迎光临.")
    try:
        p2 = Person("wusir", "")
        p2.goto_nan_yushi()
        p1 = Person("alex", "")
        p1.goto_nan_yushi()
    except GenderException as e:
        print("你去男澡堂子干嘛?")
    except Exception as e:
        print("其他错误")
    
    自定义异常

    三、日志处理

  • 相关阅读:
    Altium Designer如何从已有的PCB图中导出封装库
    获得内核函数地址的四种方法
    poj2976 Dropping tests
    poj3045 Cow Acrobats
    CF916C Jamie and Interesting Graph
    poj3104 Drying
    poj2455 Secret Milking Machine
    poj2289 Jamie's Contact Groups
    网络流最小路径覆盖
    CF897C Nephren gives a riddle
  • 原文地址:https://www.cnblogs.com/xiaomai-rhce/p/10621142.html
Copyright © 2011-2022 走看看