一、约束
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("其他错误") 自定义异常
三、日志处理