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("其他错误")

自定义异常

三、日志处理

原文地址:https://www.cnblogs.com/xiaomai-rhce/p/10621142.html