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 表示 ...
随机推荐
- day70-oracle PLSQL_02光标
涨工资之前员工的工资. 如果PLSQL程序没有commit的话,命令行这边的客户端是无法读到的.这是oracle数据库的隔离级别. 为什么在PLSQL程序中commit之后还是不行呢? PLSQL程序 ...
- valgrind详解
调不尽的内存泄漏,用不完的Valgrind Valgrind 安装 1.valgrind 安装包下载地址:http://valgrind.org/downloads/repository.html(使 ...
- 利用JavaScriptCore实现简单的功能(阶乘)
#import "RootViewController.h" #import <JavaScriptCore/JavaScriptCore.h> @interface ...
- 仿射变换详解 warpAffine
转自 http://www.cnblogs.com/dupuleng/articles/4055020.html 博客园 首页 新随笔 联系 管理 订阅 随笔- 1 文章- 185 评论- 14 ...
- 数字图像处理实验(5):Proj03-01 ~ Proj03-06 标签: 图像处理matlab 2017-04-30 10:39 184人阅读
PROJECT 03-01 : Image Enhancement Using Intensity Transformations 实验要求: Objective To manipulate a te ...
- GCD 学习(四) dispatch_group
如果想在dispatch_queue中所有的任务执行完成后在做某种操作,在串行队列中,可以把该操作放到最后一个任务执行完成后继续,但是在并行队列中怎么做呢.这就有dispatch_group 成组操作 ...
- loj10131 暗的连锁
传送门 分析 首先我们知道如果在一棵树上加一条边一定会构成一个环,而删掉环上任意一条边都不改变连通性.我们把这一性质扩展到这个题上不难发现如果一条树边不在任意一个新边构成的环里则删掉这条边之后可以删掉 ...
- JavaScript 学习中
邮箱的验证: <!DOCTYPE html><html> <head> <meta charset="UTF-8"&g ...
- Java50道经典习题-程序48 数字加密
题目:某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密规则如下:每位数字都加上5,然后用和除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换.分析:例如原始 ...
- pthread中如何追踪stack over flow
通常在程序挂掉的时候我们会catch 他们挂掉的signal,然后在signal中打印出当时的一个stack,来方便问题调查, 但是在stack overflow的情况发生时,会没有拿到stack.s ...