day18 约束 异常
1. 类的约束
方案一:抛出异常,子类必须重写父类方法,否则会报错
class Base:
def login(self): #强制xxx做XXX事
raise NotImplementedError("子类没有实现该方法") #报错 异常
class Normal( Base):
def login(self):
print("普通人登录")
class Admin( Base):
def login(self):
print("管理员登录")
class Member( Base):
def denglu(self): #方法的覆盖和重写
print("会员登录") def login(obj):
obj.login() n=Normal()
login(n) a=Admin()
login(a) m=Member() #报错
login(m)
在执行到login(m)的时候程序会报错. 原因是, 此时访问的login()是父类中的方法. 但是父
类中的方法会抛出一个异常. 所以报错. 这样程序员就不得不写login方法了. 从而对子类进行
了相应的约束,这是一套方案.
抽象的概念:如果一个类中包含抽象方法. 那么这个类一定是一个抽象类. 抽象类是不能有实例的,但是抽象类中是可以有普通方法的
方案二:使用元类来描述父类. 在元类中给出一个抽象方法. 这样子类就不得不给出抽象
方法的具体实现. 也可以起到约束的效果.
from abc import ABCMeta,abstractmethod class Animal(metaclass=ABCMeta): #类中包含抽象方法,此类就是抽象类,zhu:抽象类可以有普通方法
@abstractmethod
def chi(self): #抽象的概念
pass class Cat(Animal): #子类必须实现父类的方法,否则子类也是抽象类
def chi(self): #子类对抽象概念的实现,重写
print("用犬齿吃")
c=Cat()
c.chi() a=Animal() #报错,报错的原因自己给出
a.chi()
语法:
from abc import ABCMeta, abstractmethod class Base(metaclass = ABCMeta): 抽象类 @abstractmethod
def 方法(self):pass class Foo(Base): 子类必须重写父类中的抽象方法
def 方法(self):
pass
一个类包含类抽象方法. 这个类一定是抽象类
抽象类中可以有正常的方法 抽象类中如果有抽象方法. 这个类将不能创建对象 接口: 类中都是抽象方法
总结:其实就是父类对子类的约束,子类必须实现XX方法,有两个方案
方案一:使用抽象类和抽象方法,使用频率较低
方案二:使用人为的跑出异常,并尽量使用NotImplementedError,这样比较专业,明确
2. 异常处理
1. 异常:程序运行中的出现的错误
例:
def chu(a, b)
return a/b
ret = chu(10,0) #报错了,除数不能为0
print(ret) 异常的处理:
def chu(a,b)
return a/b
try:
ret=chu(a,b)
print(ret)
except Exception as e:
print("除数不能为0")
2 .语法:
try:
"""操作"""
except Exception as e:
"""异常的父类,可以捕捉所有的异常"""
else:
"""保护不抛出异常的代码,当try中无异常的时候运行"""
finallly:
最后总要执行我
程序先执行操作, 然后如果出错了会走except中的代码. 如果不出错, 执行else中
的代码. 不论处不出错. 最后都要执行finally中的语句. 一般我们用try...except就够了. 顶多
加上finally. finally一般用来作为收尾工作. 3.自定义异常
例.#继承了Exception就是一个有异常类 import traceack #引入traceback 为了获得堆栈信息
class GenderException(Exception):
pass class Person:
def __init__(self,name,gender):
self.name=name
self.gender=gender def bush(self):
if self.gender!="男":
raise GenderException("性别不对") #除了名字一以外都是父类中的Exception
else:
print("欢迎洗大唧唧")
try:
p1=Person("吴奇隆","男")
p1.bush() p2=Person("小三","女")
p2.bush()
except GenderException as e:
val=traceback.format_exc() #获取到堆栈信息
print(val) #测试的时候打印堆栈信息,给客户的时候就撤掉
print("没吊不要进来")
except Exception as e:
print("其他错误")
#附一个,老师的实例,比较鲜明
#一切皆文件
import abc #利用abc模块实现抽象类 class All_file(metaclass=abc.ABCMeta):
all_type='file'
@abc.abstractmethod #定义抽象方法,无需实现功能
def read(self):
'子类必须定义读功能'
pass @abc.abstractmethod #定义抽象方法,无需实现功能
def write(self):
'子类必须定义写功能'
pass # class Txt(All_file):
# pass
#
# t1=Txt() #报错,子类没有定义抽象方法 class Txt(All_file): #子类继承抽象类,但是必须定义read和write方法
def read(self):
print('文本数据的读取方法') def write(self):
print('文本数据的读取方法') class Sata(All_file): #子类继承抽象类,但是必须定义read和write方法
def read(self):
print('硬盘数据的读取方法') def write(self):
print('硬盘数据的读取方法') class Process(All_file): #子类继承抽象类,但是必须定义read和write方法
def read(self):
print('进程数据的读取方法') def write(self):
print('进程数据的读取方法') wenbenwenjian=Txt() yingpanwenjian=Sata() jinchengwenjian=Process() #这样大家都是被归一化了,也就是一切皆文件的思想
wenbenwenjian.read()
yingpanwenjian.write()
jinchengwenjian.read() print(wenbenwenjian.all_type)
print(yingpanwenjian.all_type)
print(jinchengwenjian.all_type)
day18 约束 异常的更多相关文章
- 扩展Exception,增加判断Exception是否为SQL引用约束异常方法!
在设计数据表时,如果将某些列设置为关联其它表的外键,那么如果对其进行增加.修改操作时,其关联表若没有相匹配的记录则报错,或者在对其关联表进行删除时,也会报错,这就是外键约束的作用,当然除了外键还有许多 ...
- python约束 异常 MD5 日志处理
一.约束 1.用父类执行约束 子类继承父类,用重写方法,对子类的方法进行约束. class Foo: def login(self): # 对子类进行约束,该方法需要重写 # 没有执行的错误 rais ...
- UITableView HeaderView,FooterView 使用SnapKit布局导致约束异常
今天做一个APP里面设置页面(个人中心) 就是一个列表菜单 顶部是一个头像和账户标题, 底部为一个退出登录按钮 当然我第一时间就想到了UITableView, HeaderView, FooterVi ...
- MySQL 外键异常分析
外键约束异常现象 如下测例中,没有违反引用约束的插入失败. create database `a-b`; use `a-b`; SET FOREIGN_KEY_CHECKS=0; create tab ...
- python 面向对象(五)约束 异常处理 MD5 日志处理
###############################总结###################### 1.异常处理 raise:抛出异常 try: 可能出现错误代码 execpt 异常类 a ...
- Oracle约束的启用和停用
关于Oracle的约束概念和基本操作,我已经在以前的<Constraint基础概念>.<Constraint的简单操作>两篇文章中有过比较详细的介绍了,但是对于如何停用和启 ...
- Odoo中的约束
转载请注明原文地址:https://www.cnblogs.com/cnodoo/p/9280735.html 一:装饰器约束(字段约束) 装饰器参数指定了约束的字段,当涉及的字段中任一发生改变时触发 ...
- Mysql高手系列 - 第20篇:异常捕获及处理详解(实战经验)
Mysql系列的目标是:通过这个系列从入门到全面掌握一个高级开发所需要的全部技能. 这是Mysql系列第20篇. 环境:mysql5.7.25,cmd命令中进行演示. 代码中被[]包含的表示可选,|符 ...
- HANA SQLScript
数据类型 日期时间类型 DATE(日期) DATE 数据类型由年.月.日信息组成,表示一个日期值. DATA 类型的默认格式为‘YYYY-MM-DD’. YYYY 表示年, MM 表示月而 DD 表示 ...
随机推荐
- 连接ORACLE客户端工具navicat111.12 for oracle
安装navicat111.12 for oracle后 打开
- 返回键的复写onBackPressed()介绍
本篇文章是对Android中返回键的复写onBackPressed()进行了详细的分析介绍,需要的朋友参考下 在android开发中,当不满足触发条件就按返回键的时候,就要对此进行检测.尤其是当前Ac ...
- 文科妹学 GitHub 简易教程(转)
文科妹学 GitHub 简易教程 #什么是 Github ?必须要放这张图了!!! Git 是由 Linux 之父 Linus Tovalds 为了更好地管理linux内核开发而创立的分布式版 ...
- SpringJdbc 【springjdbc的使用方法】
1 什么是springjdbc spring对jdbc的封装 2 使用SpringJdbc的编程步骤 2.1 导包 spring-jdbc : springjdbc的包 mysql : MySQL的驱 ...
- opencv3更换图片背景
#include <opencv2/opencv.hpp>#include <iostream> using namespace std;using namespace cv; ...
- 面试题: 1天的java面试题 已看1
1,自我介绍下,我直接说的项目经历,(哪年在哪个公司呆过) 2,问是否有带过团队的经历,我说去年带过一次. 3,Struts是单例模式还是多例模式?我先说单例模式,后说多例模式. Struts1是单例 ...
- Evil Book -- CodeChef
传送门 分析 对于这道题,我们首先思考一个贪心策略,即对于所有我们要打败的厨师我们肯定可以先打败需使用帮助次数少的厨师再打败需使用帮助次数多的厨师 ,因为这样可以使得能支付得起帮助费用的可能性尽可能的 ...
- Jtabbedpane设置透明、Jpanel设置透明
摘自 https://zhidao.baidu.com/question/983204331427010139.html java中如何设置Jtabbedpane为透明 20 在Jtabbedpane ...
- struts1和struts2之间的区别
从action类上分析:1.Struts1要求Action类继承一个抽象基类.Struts1的一个普遍问题是使用抽象类编程而不是接口. 2. Struts 2 Action类可以实现一个Action接 ...
- 市场上主流的BI产品的“答案之书”
本文来自网易云社区. 从20世纪80年代开始,商业智能的定义出现在人们面前,早期商业智能十分基础和杂乱,不仅仅会把数据处理放进去.还包含有一些可视化方面内容等.这个时期的BI主要的功能是支持多维分析和 ...