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