python面向对象(其二)
类的异常表现
小明被绿了,开始暴躁了。
---------------------------------------超人小明 --------------------属性---------------- --------------------方法---------------- 滚出去: 多次让小明滚出去,可能会挨揍 写给老婆阿芳的家信:每次想起深爱的阿花,小明都会崩溃
方法说明:
- 滚出去:每次让小明滚出去都可能收获一个意料之外的拳头
- 写给老婆阿芳的家信:每次调用时,小明都会自己崩溃
如上,用代码表现出来就是
class SuperGreenManXiaoMing(SuperManXiaoMing):def __init__(self, relationship):super(SuperGreenManXiaoMing,self).__init__(relationship)self.__goOut_times = 0def goOut(self):self.__goOut_times+= 1if self.__goOut_times < 3:return "心情不好,憋说话!%s"%self.relationshipelse:return Exception("感受我社会主义愤怒的绿色小拳拳吧")def loveToWife(self):wife = 0love = 999.99print "阿芳,额对你的爱有 %s 深"%(love/wife)
实际调用效果如下:
green = SuperGreenManXiaoMing("brother")print green.goOut()print green.goOut()g = green.goOut()print isinstance(g, Exception)print g# ------------output---------- # 心情不好,憋说话!brother # 心情不好,憋说话!brother # True # 感受我社会主义愤怒的绿色小拳拳吧 green.loveToWife() # ------------output---------- # Traceback (most recent call last): # File "/Users/Silence/Documents/xiaoming.py", line 110, in <module> # green.loveToWife() # File "/Users/Silence/Documents/xiaoming.py", line 75, in loveToWife # print "阿芳,额对你的爱有 %s 深"%(love/wife) # ZeroDivisionError: float division by zero
可以看出:
- loveToWife()函数是class内部异常,只能捕获兼容,不能任何规避;
- goOut()由于是返回的一个Excetion对象,所以即可以在小于3次时规避,也后期进行兼容。
另外,goOut的异常返回还有一种书写方式,如下:
def goOut(self):self.__goOut_times+= 1if self.__goOut_times < 3:return "心情不好,憋说话!%s"%self.relationshipelse:raise Exception("感受我社会主义愤怒的绿色小拳拳吧")
这种写法,会将Exception直接抛出给最上层调用方,执行效果如下
green = SuperGreenManXiaoMing("brother")print green.goOut()print green.goOut()g = green.goOut()# ------------output---------- # 心情不好,憋说话!brother # 心情不好,憋说话!brother # Traceback (most recent call last): # File "/Users/Silence/Documents/xiaoming.py", line 108, in <module> # g = green.goOut() # File "/Users/Silence/Documents/xiaoming.py", line 71, in goOut # raise Exception("感受我社会主义愤怒的绿色小拳拳吧") # Exception: 感受我社会主义愤怒的绿色小拳拳吧
在上述三种异常的表现方式,区别在于:
异常表现 | 严重级别 | 友好度 | 使用场景 |
---|---|---|---|
return Exception() | 中 | 高 | 多参数返回时,作为协议中正确字段的返回 |
raise Exception() | 高 | 中 | 对于正常业务流中的异常,不做完善兼容,完全寄希望于调用方来兼容 |
1/0(也可以称呼为code Exception) | 高 | 差 | 代码bug |
类的异常调用与兼容
- return Exception
- 接口协议中的一个正常字段,正常判断就可以
class SuperGreenOldManXiaoMing(SuperGreenManXiaoMing):"""docstring for SuperGreenManXiaoMing"""def __init__(self, relationship):super(SuperGreenOldManXiaoMing, self).__init__(relationship)def goOut(self):if self.relationship in ["sister","brother","parent"]:return "你们牛逼,听你的", Noneelif self.relationship in ["wife", "girlfriend"]:return "", Exception("憋跟我说话")else:return "滚粗", Exception("不想理你们") old = SuperGreenOldManXiaoMing("sister") out, e = old.goOut() if not e:print "小明没有揍我,哈哈哈" else:print "小明揍我了",e
- Raise Exception
- 直接抛出一个异常,如果调用方比较坑,不想兼容,则会出现互相坑的情况;
- 调用方通常会为了这个写一堆try…except…
class SuperGreenBoringManXiaoMing(SuperGreenManXiaoMing):"""docstring for SuperGreenManXiaoMing"""def __init__(self, relationship):super(SuperGreenBoringManXiaoMing, self).__init__(relationship)def goOut(self):if self.relationship in ["sister","brother","parent"]:return "你们牛逼,听你的"else:raise Exception("不想理你们")boring = SuperGreenBoringManXiaoMing("boss") try:b = boring.goOut() except:print "我挡!小明想揍我,可惜没揍到"pass
- code Exception
- 直接提bug修改吧
自定义异常
异常类和错误类,一句话概括为:包含错误文本信息的特殊class结构
目前python中所有的Error、Exception都继承自BaseException,而我们常用的Exception则指所有常见错误的基类,不包括语法错误等。
为什么要自定义异常?
- 虽然小明被绿了以后,除了兄弟姐妹父母外,别人的话都听不进去,但是,不同的人说话还是有区别的
- 交情好的人,小明可以选择耐着性子听听
- 交情一般的人,小明会给一些眼神和委婉的表达
- 没交情甚至落井下石的人,小明会直接上手揍了
对于听不进去的情形,我们都可以标记为Exception,但是不同的场景,Exception的处理是不一样的
代码解释为:
class RelationGoodError(Exception):def __init__(self, value):self.value = valuedef __str__(self):ming = SuperGreenManXiaoMing("friend")ming.age = 42return "道理我都懂,但是能不能过去还是得看自己啊"class RelationNormalError(Exception):def __init__(self, value):self.value = valuedef __str__(self):return "给你们一个让我安静的眼神,自己体会"class RelationBadError(Exception):def __init__(self, value):self.value = valuedef __str__(self)return "来呀,感受下我心中的愤怒吧!"class SuperGreenBoringManXiaoMing(SuperGreenManXiaoMing):def __init__(self, relationship):super(SuperGreenBoringManXiaoMing, self).__init__(relationship)def goOut(self): if self.relationship in ["sister","brother","parent"]:raise RelationGoodError("你们牛逼,听你的")elif self.relationship in ["friend", "classmates"]:raise RelationNormalError("不想理你们")else:raise RelationBadError("接受社会主义绿色小拳头吧!") boring = SuperGreenBoringManXiaoMing("boss") try:b = boring.goOut() # except 可以多个,用于区分不同的Error # 同一个except 里面,可以汇总多个Exception,都使用一种处理结果 except RelationGoodError, RelationNormalError:print "我挡!小明想揍我,可惜没揍到" except RelationBadError, e:print "我擦,真揍我!"print e finally:print "其实,小明有个美满的家庭了现在,日子很幸福"
转载于:https://www.cnblogs.com/SilenceCity/p/pythonOO2.html
python面向对象(其二)相关推荐
- python面向对象的优点_Python面向对象编程——总结面向对象的优点
Python面向对象编程--总结面向对象的优点 一.从代码级别看面向对象 1.在没有学习类这个概念时,数据与功能是分离的 def exc1(host,port,db,charset): conn=co ...
- 这可能是Python面向对象编程的最佳实践
作者 | 崔庆才 来源 | 进击的Coder(ID:FightingCoder) Python 是支持面向对象的,很多情况下使用面向对象编程会使得代码更加容易扩展,并且可维护性更高,但是如果你写的多了 ...
- 第八课.Python面向对象(二)
类的继承和多态 继承和多态与函数有共同的目的,都是为了减少代码的冗余,提高复用的效率: 根据"Python面向对象(一)"的笔记,我现在定义一个Cinema类: #父类 class ...
- Python面向对象编程:类继承和其衍生术语
Python面向对象编程03:类继承和其衍生术语 前面我们讲到过正则表达式字符等,上一篇分享了面向对象编程和类的结构,最后稍微提到了继承. Python面向对象编程:深度认识类class_ Pytho ...
- 《Python面向对象编程指南》——1.2 基类中的__init__()方法
本节书摘来自异步社区<Python面向对象编程指南>一书中的第1章,第1.2节,作者[美]Steven F. Lott, 张心韬 兰亮 译,更多章节内容可以访问云栖社区"异步社区 ...
- Python 面向对象 基础
编程范式概述: 面向过程 和 面向对象 以及函数式编程 面向过程:(Procedure Oriented)是一种以事件为中心的编程思想. 就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实 ...
- python面向对象类属性_python面向对象之类属性和类方法案例分析
本文实例讲述了python面向对象之类属性和类方法.分享给大家供大家参考,具体如下: 目标 类的结构 类属性和实例属性 类方法和静态方法 01. 类的结构 1.1 术语 -- 实例 使用面相对象开发, ...
- 关于python面向对象编程中、下列说法中_关于Python面向对象编程的知识点总结
前言 如果你以前没有接触过面向对象的编程语言,那你可能需要先了解一些面向对象语言的一些基本特征,在头脑里头形成一个基本的面向对象的概念,这样有助于你更容易的学习Python的面向对象编程. 接下来我们 ...
- python对象编程例子-这是我见过最详细的Python面向对象编程!建议收藏!
原标题:这是我见过最详细的Python面向对象编程!建议收藏! 面向对象编程和函数式编程(面向过程编程)都是程序设计的方法,不过稍有区别. 面向过程编程: 1. 导入各种外部库 2. 设计各种全局变量 ...
- python面向对象编程的优点-Python面向对象编程——总结面向对象的优点
Python面向对象编程--总结面向对象的优点 一.从代码级别看面向对象 1.在没有学习类这个概念时,数据与功能是分离的 def exc1(host,port,db,charset): conn=co ...
最新文章
- 【趋势】未来十年计算机体系结构的历史和趋势
- 理解 Word2Vec 之 Skip-Gram 模型【全】
- 99.Shell脚本自启程序并监控(实现全自动监控服务)
- CentOS谢幕,Anolis OS的无限可能
- at24c16如何划分出多个读写区_漫话:如何给女朋友解释为什么Windows上面的软件都想把自己安装在C盘...
- linux安装opencv让输入密码,linux下安装opencv的全过程(对初学者或者linux不熟悉的童鞋,非常适合)...
- 运维测试工作笔记0004---各种免费开源的测试平台
- 猴子数据让你深刻了解微信富媒体
- python飞机大战游戏素材_python实现飞机大战小游戏
- 将哔哩哔哩手机端缓存视频导出为正常mp4视频.
- JS中监听事件的写法
- 微信小程序 自定义控件 数字键盘
- 基于时间序列特征提取的车载网络系统入侵检测技术
- 兄弟连 linux 学习记录
- element表格分页功能
- word中如何批量更新题注(域)
- 08.数据结构:第一个动态结构-链表
- 泛微e-office怎么样?
- WebOffice常用API接口使用手册教程
- Python bytes转换为string