【Python学习之八】设计模式和异常
环境
虚拟机:VMware 10
Linux版本:CentOS-6.5-x86_64
客户端:Xshell4
FTP:Xftp4
python3.6
一、设计模式
1、单例模式
确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,单例模式是一种对象创建型模式。
class Singleton(object):
__instance=None
__first_init=False def __new__(cls,name,age):
if not cls.__instance:
cls.__instance=object.__new__(cls);
return cls.__instance
def __init__(self,name,age):
if not self.__first_init:
self.name=name
self.age=age
Singleton.__first_init=True a=Singleton('bin',18)
b=Singleton('bin',8)
#只有一个实例
print(id(a))
print(id(b))
#只初始化一次
print(a.age)
print(b.age)
#修改属性
a.age=19
print(b.age)
2、工厂模式
2.1、Simple Factory模式不是独立的设计模式,他是Factory Method模式的一种简单的、特殊的实现。他也被称为静态工厂模式,通常创建者的创建方法被设计为static方便调用。
(1)静态的工厂类
(2)用全局函数改写工厂类
class Person(object):
def __init__(self,name):
self.name=name
def work(self,type):
print('%s开始工作了'%self.name)
ax=Factory.create_axe(self, type)
ax.cut_tree() class Axe(object):
def cut_tree(self):
print('开始砍树了')
class StoneAxe(Axe):
def cut_tree(self):
print('石斧砍树')
class SteelAxe(Axe):
def cut_tree(self):
print("使用钢斧头砍树")
class WaterAxe(Axe):
def cut_tree(self):
print("使用水砍树") class Factory(object):
@staticmethod
def create_axe(self,ax_type):
if ax_type=='stone':
return StoneAxe()
elif ax_type=='steel':
return SteelAxe()
elif ax_type=='water':
return WaterAxe()
else:
print('类型错误')
p=Person('光头强')#光头强开始工作了
p.work('steel')#使用钢斧头砍树
2.2、工厂方法模式
工厂方法模式去掉了简单工厂模式中工厂方法的静态方法,使得它可以被子类继承。对于python来说,就是工厂类被具体工厂继承。这样在简单工厂模式里集中在工厂方法上的压力可以由工厂方法模式里不同的工厂子类来分担。
抽象的工厂类提供了一个创建对象的方法,也叫作工厂方法。
(1) 抽象工厂角色(Factory): 这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。
(2) 具体工厂角色(Stone_Axe_Factory,Steel_Axe_Factory):它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。
(3) 抽象产品角色(Axe):它是具体产品继承的父类或者是实现的接口。在python中抽象产品一般为父类。
(4) 具体产品角色(Stone_Axe,Steel_Axe):具体工厂角色所创建的对象就是此角色的实例。由一个具体类实现。
二、异常
当Python检测到一个错误时,解释器就无法继续执行了,反而出现了一些错误的提示,这就是所谓的"异常"。
1、捕获异常
try:
f=open('123.txt','r')
except IOError:
print('文件打开报错')
2、当捕获多个异常时,可以把要捕获的异常的名字,放到except 后,并使用元组的方式仅进行存储
try:
f=open('123.txt','r')
print(num)
except (IOError,NameError):
pass
3、获取异常的信息描述
try:
f=open('123.txt','r')
except Exception as result:
print(result)
4、捕获所有异常
except后面不跟具体错误类型或者跟Exception
try:
f=open('123.txt','r')
except:
pass
或
try:
f=open('123.txt','r')
except Exception as result:
print(result)
5、else,如果没有捕获到异常,那么就执行else中的事情
try:
num = 100
print(num)
except NameError as errorMsg:
print('产生错误了:%s'%errorMsg)
else:
print('没有捕获到异常,真高兴')
6、 try...finally...
在程序中,如果一个段代码必须要执行,即无论异常是否产生都要执行,那么此时就需要使用finally。
import time
try:
f=open('txt')
try:
while True:
content=f.readline()
if len(content)==0:
break
print(content)
time.sleep(2)
except TypeError as ex:
pass
finally:
f.close()
print('关闭文件')
except:
print('没有这个文件')
7、异常的传递
如果try嵌套,那么如果里面的try没有捕获到这个异常,那么外面的try会接收到这个异常,然后进行处理,如果外边的try依然没有捕获到,那么再进行传递
如果一个异常是在一个函数中产生的,例如函数A---->函数B---->函数C,而异常是在函数C中产生的,那么如果函数C中没有对这个异常进行处理,那么这个异常会传递到函数B中,如果函数B有异常处理那么就会按照函数B的处理方式进行执行;如果函数B也没有异常处理,那么这个异常会继续传递,以此类推。。。如果所有的函数都没有处理,那么此时就会进行异常的默认处理,即通常见到的那样.
8、自定义异常
用raise语句来引发一个异常。异常/错误对象必须有一个名字,且它们应是Error或Exception类的子类。
class ShortInputException(Exception):
def __init__(self,length,atleast):
super().__init__()
self.length=length
self.atleast=atleast
def main():
try:
s=input('请输入->')
if len(s)<3:
raise ShortInputException(len(s),3)
except ShortInputException as result:
print('ShortInputException: 输入的长度是 %d,长度至少应是 %d'% (result.length, result.atleast))
else:
print('没有异常发生.')
9、异常处理中抛出异常
class Test(object):
def __init__(self,switch):
self.switch=switch
def cacl(self,a,b):
try:
return a/b
except Exception as ex:
if self.switch:
print("捕获开启,已经捕获到了异常,信息如下:")
print(result)
else:
raise
a=Test(True)
a.cacl(11, 0)
print("----------------------华丽的分割线----------------")
a.switch = False
a.calc(11,0)
参考:
Python学习笔记
【Python学习之八】设计模式和异常的更多相关文章
- 【python学习笔记】8.异常
[python学习笔记]8.异常 raise Exception: 抛出指定异常 try/except: 捕捉异常 except: 第一个参数是需要捕获的异常类型,可以是多个类型组成元组,第二个参数是 ...
- Python学习笔记:07异常
异常 Python用异常对象(Exception Object)来表示异常情况,当异常未被捕获时,就会产生回溯(Traceback) 异常分类 內建异常类:Exception,AttributeErr ...
- Python学习_07_错误、异常
地毯式地过语法终于快要结束了... Python中的常见异常 1.NameError:尝试访问一个未初始化的变量 2. ZeroDivisionError:除数为0 3. SyntaxError:Py ...
- python学习笔记(七)、异常
在实际开发中,往往不会出现一个系统编写下来,没有出现任何一个bug.为处理这种会出现错误的地方,如除数为零的除法,python提供了非常强大的机制————异常处理机制. 1 异常 python使用异常 ...
- python学习笔记十:异常
一.语法 #!/usr/bin/python filename='hello' #try except finally demo try: open('abc.txt') print hello ex ...
- python学习二(文件与异常)
Python中使用open BIF与文件交互,与for语句结合使用,一次读取一行 读取文件sketch.txt,文件内容如下: Man: Ah! (taking out his wallet and ...
- python学习(八) 异常
8.1 什么是异常 8.2 按自己的方式出错 如何引发异常,以及创建自己的异常类型. 8.2.1 raise语句 >>> raise Exception Traceback (mos ...
- 【Python学习之八】ORM
ORM 什么是ORM呢? ORM全称是:Object-Relational Mapping.即对象-关系映射,就是把关系数据库的一行映射为一个对象,也就是一个类对应一个表.这样,写代码更简单,不用直接 ...
- Python学习 Part6:错误和异常
Python学习 Part6:错误和异常 两种不同类型的错误:语法错误和异常 1. 语法错误 语法错误,也被称作解析错误: >>> while True print('Hello w ...
随机推荐
- linux Crontab定时备份项目案例
首先先写好备份的脚本(拷贝的命令) #bash/bin cd /finance/tomcat8-finance/wtpwebapps tar -czf /finance/webapp_backup/* ...
- collections.defaultdict()
https://www.cnblogs.com/herbert/archive/2013/01/09/2852843.html >>> import collections > ...
- 代码编辑器与IDE(集成开发环境)
编辑器就是轻量级的只用于编辑代码: nodepad++, sublime, ...... IDE就是包含很多例如调试, 编译,UI界面的功能更为完善的软件: Pycharm(python用的多), V ...
- template_constructor_function
#include <iostream> using namespace std; template <class T> class MyClass{ public: templ ...
- 导出服务器Oracle数据库为dmp文件
本文链接:https://blog.csdn.net/rensheng_ruxi/article/details/79877267一.前提:本机安装有Oracle客户端,并且是正确安装. 二.导出Or ...
- C# 基础回顾: volatile 关键字
有些人可能从来没看到过这个关键字,这也难怪,因为这个关键字并不常用.那这个关键字到底有什么用呢? 我在网上搜索这个关键字的时候,发现很多朋友都有一个错误的认识 ------ 认为这个关键字可以防止并发 ...
- CF547E Mike and Friends 后缀自动机+线段树合并
裸题,敲完后没调就过了 ~ code: #include <bits/stdc++.h> using namespace std; #define ll long long #define ...
- 一天一经典Efficient Estimation of Word Representations in Vector Space
摘要 本文提出了两种从大规模数据集中计算连续向量表示(Continuous Vector Representation)的计算模型架构.这些表示的有效性是通过词相似度任务(Word Similarit ...
- java学习笔记(5) 控制语句、键盘输入
控制语句: java控制可以分为7种: *控制选择结构语句: *if if else *switch *控制循环结构语句: *for *while *do while *改变控制语句顺序: *bre ...
- (16)Go文件处理
package main import ( "bufio" "fmt" "os" ) func main() { // 新建文件 file, ...