• Day-18 面向对象05 约束、异常处理、日志处理


    一、约束

      1.抛出异常

     1 # 项目经理(级别高一点儿)
     2 class Base:
     3     def login(self): # 强制子类做xxxx事
     4         raise NotImplementedError("子类没有实现该方法") # 报错. 抛异常
     5 
     6 # 1. 普通账号  -->  翔哥
     7 class Normal(Base):
     8     def login(self):
     9         print("普通账号的登录")
    10 
    11 # 2. 吧务  - > 强哥
    12 class Member(Base):
    13     def login(self):
    14         print("吧务的登录")
    15 
    16 # 3. 百度员工  -> 明哥
    17 class Admin(Base):
    18     def login(self): # 方法的覆盖和重写
    19         print("管理员的登录")
    20 
    21 # 项目经理
    22 def wodetian(obj):
    23     obj.login()
    24 
    25 n = Normal()
    26 wodetian(n)
    27 
    28 m = Member()
    29 wodetian(m)
    30 
    31 a = Admin()
    32 wodetian(a)
    抛出异常应用

      2.抽象类

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

     1 from abc import ABCMeta, abstractmethod
     2 #贴吧
     3 #项目经理(级别高一点儿)
     4 class Base(metaclass=ABCMeta): # 抽象类
     5     # 抽象方法
     6     @abstractmethod # staticmethod, classmethod
     7     def login(self): # 强制子类做xxxx事
     8         pass
     9 
    10     def hehe(self): # 抽象类中可以有正常的方法
    11         print("我会呵呵呵")
    12 
    13 # b = Base() # 报错的. 原因是Base是一个抽象类. 含有抽象方法. 不允许创建对象的
    14 
    15 # 一个类如果全部都是抽象方法. 这个类可以被称为接口. 用来约束子类和规范子类
    16 
    17 # 1. 普通账号  -->  翔哥
    18 class Normal(Base):
    19     pass
    20     # def login(self): # 重写了父类中的抽象方法
    21     #     print("普通账号的登录")
    22 
    23 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 可以把系统产生的这个错误获取到,过程叫捕获异常

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

      自定义异常:

     1 class GenderException(Exception):
     2     pass
     3 
     4 class Person:
     5     def __init__(self, name, gender):
     6         self.name = name
     7         self.gender = gender
     8 
     9     #  洗澡 -> 男的进男浴室
    10     def goto_nan_yushi(self):
    11         if self.gender != "":
    12             raise GenderException("性别不对") # 除了名字以外都是父类中的Exception
    13         else:
    14             print("欢迎光临.")
    15 try:
    16     p2 = Person("wusir", "")
    17     p2.goto_nan_yushi()
    18     p1 = Person("alex", "")
    19     p1.goto_nan_yushi()
    20 except GenderException as e:
    21     print("你去男澡堂子干嘛?")
    22 except Exception as e:
    23     print("其他错误")
    自定义异常

    三、日志处理

  • 相关阅读:
    //删除字符串值的某个值
    disabled和readonly 的用法区别
    Js判断为空或不是对象或是否相等
    1.类型分析:
    多行内容放到一行中(内容的合并)
    sql split
    sql修改列名
    对oracle数字类型的研究
    kettle--组件(3)--行转列
    kettle--组件(2)--计算器
  • 原文地址:https://www.cnblogs.com/minusone/p/9947536.html
Copyright © 2020-2023  润新知