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("其他错误")
自定义异常

三、日志处理

原文地址:https://www.cnblogs.com/minusone/p/9947536.html