【012】Python全栈日记-异常

今天以异常为主,但是还有一些杂七杂八的知识点,东西不多,也不难,多练习。

一、MRO列表

Method Realtion Order 用来制作一个继承关系​的列表

python3中使用C3算法来计算MRO列表(计算过程暂时忽略)

MRO列表的制作原则:

1.子类永远在父类的前面

2.如果继承了多个父类,那么按照()中的顺序在列表中摆放

3.如果多个类同时继承了一个父类,孙子类中只会选取第一个父类中的父类的该方法

看几个例子猜结果:(反正没学MRO列表之前,答案一个我都没猜对)

按理说C继承AB那就应该c strat,a start,b start,我们看一下结果:

居然没有过B,原因在于super().__init__()代表一个父类,而不说所有的父类,那如果我们想让他输出b start应该怎么做呢?

如果把B.__init__(self)换成super().__init__(),会输出两次a start,并不会经过B。

在上面的例子扩展一下:

super().aa()、super().bb()、self.aa()、self.bb()因为包含了AB的方法,所以就会调用A B 。

结果:

再看一个例子:猜结果

按照之前对super()的理解结果肯定是:D start,B start,A start,A end,B end,C start,A start,A end,C end,D start。

但是运行后,发现结果是这样的:

这时候,你就会感觉到,这个super好像已经不是原来的super了,确实是这样,在继承多个父类的时候,super()就不是父类了,而是MRO列表的上一级,我们的继承关系就得跟着MRO列表走,什么是MRO列表呢?我们在刚才的程序最后加一行代码print(D.mro())。

结果为:

列表中类D在最前面,然后是B,C,A,object。

根据我们MRO列表的第一条规定:子类永远在父类的前面

所以后面的就是前面的父类,而object是python内置的类,供所有类使用,默认新建的类都会继承object。

我们再回去看上面题的结果,应该就能明白为什么是那个顺序了把。

二、错误和异常处理

在python中一共有2种错误:一种是语法错误,另外一种是异常

1、异常

异常是指在语法正确的前提下,程序的报错就是异常。

它是在程序异常时单独存在的一个对象,可以对其进行获取或其他操作

2、异常的分类

AssertError              断言语句(assert)失败

AttributeError           尝试访问未知的对象属性

EOFError                 用户输入文件末尾标志EOF(Ctrl+d)

FloatingPointError       浮点计算错误

GeneratorExit             generator.close()方法被调用的时候

ImportError               导入模块失败的时候

IndexError                索引超出序列的范围

KeyError                  字典中查找一个不存在的关键字

KeyboardInterrupt         用户输入中断键(Ctrl+c)

MemoryError               内存溢出(可通过删除对象释放内存)

NameError                 尝试访问一个不存在的变量

NotImplementedError       尚未实现的方法

OSError                   操作系统产生的异常(例如打开一个不存在的文件)

OverflowError             数值运算超出最大限制

ReferenceError            弱引用(weak reference)试图访问一个已经被垃圾回收机制回收了的对象

RuntimeError              一般的运行时错误

StopIteration             迭代器没有更多的值

SyntaxError               Python的语法错误

IndentationError          缩进错误

TabError                  Tab和空格混合使用

SystemError               Python编译器系统错误

SystemExit                Python编译器进程被关闭

TypeError                 不同类型间的无效操作

UnboundLocalError         访问一个未初始化的本地变量(NameError的子类)

UnicodeError              Unicode相关的错误(ValueError的子类)

UnicodeEncodeError        Unicode编码时的错误(UnicodeError的子类)

UnicodeDecodeError        Unicode解码时的错误(UnicodeError的子类)

UnicodeTranslateError     Unicode转换时的错误(UnicodeError的子类)

ValueError                传入无效的参数

ZeroDivisionError         除数为零

3、常见的错误操作:

[1]IndexError 索引错误

[2]KeyError 键不存在

[3]AssertError 断言错误

4、错误异常处理

 [1]try...except...

[2]except捕获多个异常

或者

但是这两种方法,如果出现多个异常,也只会读取第一个,因为遇到异常,就直接跳到except,而不在try里继续运行。

[3]捕获所有异常

[4]输出异常信息

[5]try...finally...

在程序中,如果一个段代码必须要执行,即无论异常是否产生都要执行,那么此时就需要使用finally。 比如文件关闭,释放锁,把数据库连接返还给连接池等

[6]使用raise抛出异常

一般没啥实际作用

[7]自定义异常

三、文件补充知识点

讲玩异常就可以再补充一个知识点了。

我们打开文件后如果忘记输入f.close(),文件就会一直占用内存,那有没有一种更好的方法呢?还真有,用with,我们看看下面的方法:

with open(c:\\digits.txt,’r’) as f:  ==  f.open(c:\\digits.txt,’r’) + f.close

with open(c:\\digits.txt,’w’) as f:  ==  f.open(c:\\digits.txt,’w’) + f.close

with open(c:\\digits.txt,’a’) as f:  ==  f.open(c:\\digits.txt,’a’) + f.close

关键字with在不再需要访问文件后将其关闭。在这个程序中,注意到我们调用了open() , 但没有调用close() ;你也可以调用open() 和close() 来打开和关闭文件,但这样做时,如果程序存在bug,导致close() 语句未执行,文件将不会关闭。这看似微不足道,但未妥善地关闭文件可能会导致数据丢失或受损。举一个班里同学的例子,我同学的循环写入文档,忘记设置关闭条件,然后一直在写入,等他吃饭回来电脑卡死,c盘块写满了。所以不光是文档,循环的结束条件也非常重要!!!

如果在程序中过早地调用close() ,你会发现需要使用文件时它已关闭(无法访问),这会导致更多的错误。并非在任何情况下都能轻松确定关闭文件的恰当时机,但通过使用前面所示的结构,可让Python去确定:你只管打开文件,并在需要时使用它,Python自会在合适的时候自动将其关闭。

所以强烈推荐使用这种方法。

四、设计模式

上一个日记了解了工厂模式,今天再说两个设计模式。

1、 观察者模式:

需求:老板要给各部门的员工发通知,要求部门不同称呼不同。

这里有两类人,一类是观察者,即部门,一类是通知者,即老板,部门在观察老板的状态,老板负责通知部门最新的动态。

结果:

这里的两个类的耦合是非常大的,它们是相互依赖的。一方面是老板类的notify方法会调用部门观察者类的update方法,另一方面,观察者类会访问调用老板类的msg属性来获取最新的动态。

2、 策略模式

策略指的就是为了达到某一目的而采取的手段或者方法。例如商家卖东西实现软件设计打折方法,对象可能会用到多种多样的算法。这些算法甚至会经常改变。如果将这些算法都硬编码到对象中,将会使得对象本身变得臃肿不堪,而且有时候支持不同的算法也是一个性能负担。

策略模式很好的实现了在运行时根据需要透明的更改对象的算法和将算法与本身对象解耦,从而避免出现上述两个问题。

因此策略模式可以定义为:定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。策略模式让算法可以独立于使用它的客户变化。每一个封装算法的类称之为策略(Strategy)类,策略模式提供了一种可插入式(Pluggable)算法的实现方案。

假设某商户准备本店折扣,有三种方法, 一种是平时买东西不打折,一种是618打8折,一种是双11满400减50,应如何设计该系统?

结果:

猜你喜欢

转载自blog.csdn.net/weixin_39561473/article/details/85911758