python语言(七)面向对象、异常处理
一、异常处理
python解释器检测到错误,触发异常(也允许程序员自己触发异常)。程序员编写特定的代码,专门用来捕捉这个异常(这段代码与程序逻辑无关,与异常处理有关)。如果捕捉成功则进入另外一个处理分支,执行你为其定制的逻辑,使程序不会崩溃,这就是异常处理。
python解释器去执行程序,检测到了一个错误时,触发异常,异常触发后且没被处理的情况下,程序就在当前异常处终止,后面的代码不会运行,谁会去用一个运行着突然就崩溃的软件。所以你必须提供一种异常处理机制来增强你程序的健壮性与容错性。良好的容错能力,能够有效的提高用户体验,维持业务的稳定性。
程序运行中的异常可以分为两类:语法错误和逻辑错误。首先,我们必须知道,语法错误跟异常处理无关,所以我们在处理异常之前,必须避免语法上的错误。
异常就是程序运行时发生错误的信号,在python中,错误触发的异常如下

1.1 异常处理方式
1.1.1 使用if判断式
# 我们平时用if做的一些简单的异常处理
num1 = input('>>: ') # 输入一个字符串试试
if num1.isdigit():
int(num1) # 我们的正统程序放到了这里,其余的都属于异常处理范畴
elif num1.isspace():
print('输入的是空格,就执行我这里的逻辑')
elif len(num1) == 0:
print('输入的是空,就执行我这里的逻辑')
else:
print('其他情情况,执行我这里的逻辑')
# 这些if,跟代码逻辑并无关系,显得可读性极差,如果类似的逻辑多,那么每一次都需要判断这些内容,就会倒置我们的代码特别冗长。
使用if判断式可以异常处理,但是if判断式的异常处理只能针对某一段代码,对于不同的代码段的相同类型的错误你需要写重复的if来进行处理。而且在你的程序中频繁的写与程序本身无关,与异常处理有关的if,会使得你的代码可读性极其的差。
1.1.2 python提供的特定的语法结构
part1:基本语法
try:
被检测的代码块
except 异常类型:
try中一旦检测到异常,就执行这个位置的逻辑
part2:单分支
a = [1,2,3]
d = {}
try:
a[3]
print(d['name'])
except IndexError as e:
print('下标越界',e)
except KeyError as e:
print('字典key不存在')
else:
print('正常运行')
下标越界 list index out of range
finally: 有没有出现异常都走这
a = [1,2,3]
d = {}
try:
a[3]
print(d['name'])
except Exception as e: # 所有异常都能捕捉到
print('出异常了',e)
else:
print('正常运行')
finally:
print('有没有出现异常都走这')
出异常了 list index out of range 有没有出现异常都走这
异常处理try except用法中,如果使用了return就不需要使用else
try:
cur.execute(sql)
except Exception as e:
print('mysql连接失败,%s' %sql)
# result = False # 如果使用了return 就不需要使用else
else:
...
part3:多分支
l1 = [('电脑',16998),('鼠标',59),('手机',8998)]
while 1:
for key,value in enumerate(l1,1):
print(key,value[0])
try:
num = input('>>>')
price = l1[int(num)-1][1]
except ValueError:
print('请输入一个数字')
except IndexError:
print('请输入一个有效数字')
#这样通过异常处理可以使得代码更人性化,用户体验感更好。
part4:万能异常
在python的异常中,有一个万能异常:Exception,他可以捕获任意异常。它是一把双刃剑,有利有弊,我们要视情况使用
如果你想要的效果是,无论出现什么异常,我们统一丢弃,或者使用同一段代码逻辑去处理他们,那么只有一个Exception就足够了。
如果你想要的效果是,对于不同的异常我们需要定制不同的处理逻辑,那就需要用到多分支了。我们可以使用多分支+万能异常来处理异常。使用多分支优先处理一些能预料到的错误类型,一些预料不到的错误类型应该被最终的万能异常捕获。需要注意的是,万能异常一定要放在最后,否则就没有意义了。
except Exception as e: 所有异常都能捕捉到
1 a = [1,2,3]
2 d = {}
3 try:
4 a[3]
5 print(d['name'])
6 except Exception as e: # 所有异常都能捕捉到
7 print('出异常了',e)
8 else:
9 print('正常运行')
出异常了 list index out of range
part5:try...else语句
try:
for i in range(10):
int(i)
except IndexError as e:
print(e)
else:
print('***********') #*********** 执行了此处
#当try语句中的代码没有异常,被完整地执行完,就执行else中的代码
小结
try:
# 可能发生异常的代码
except 异常类型1 as 变量名:
print(变量名) # 变量名存储的是具体的错误信息
except 异常类型2 as 变量名:
print(变量名) # 变量名存储的是具体的错误信息
except Exception as 变量名:
print(变量名) # 变量名存储的是具体的错误信息
else:
print('如果以上代码没有发生异常以及异常处理工作就执行这里的代码')
print('一般情况下else中的代码用来下结论')
# logging模块
finally:
print('不管代码是否有异常都会执行,且在函数中遇到return仍然会执行')
print('一般情况下用于这个函数中资源的回收')
1.2 断言
assert断言是声明其布尔值必须为真的判定,如果发生异常就说明表达示为假。可以理解assert断言语句为raise-if-not,用来测试表示式,其返回值为假,就会触发异常。
assert的异常参数,其实就是在断言表达式后添加字符串信息,用来解释断言并更好的知道是哪里出了问题。格式如下:
assert expression [, arguments]
assert 表达式 [, 参数]
assert len(lists) >=5,'列表元素个数小于5'
assert 2==1,'2不等于1'
备注:格式:assert 条件 , 条件为false时的错误信息 结果为raise一个AssertionError出来
# assert 条件 assert 1 == 1 assert 1 == 2
二、面向对象
概述
面向对象:核心对象二字,对象是特征与技能的结合体
基于该思想编写程序就好比是在创造一个世界,你就是这个世界的上帝,是一种上帝式的思维方式
2.1 类
面向对象技术简介
- 类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
- 类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
- 数据成员:类变量或者实例变量, 用于处理类及其实例对象的相关的数据。
- 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
- 局部变量:定义在方法中的变量,只作用于当前实例的类。
- 实例变量:在类的声明中,属性是用变量来表示的。这种变量就称为实例变量,是在类声明的内部但是在类的其他成员方法之外声明的。
- 继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟"是一个(is-a)"关系(例图,Dog是一个Animal)。
- 实例化:创建一个类的实例,类的具体对象。
- 方法:类中定义的函数。
- 对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。
类:一个模型,一个图纸
类:种类、分类、类别
对象是特征与技能的结合体,类是一系列对象相似的特征与技能的结合体
强调:站的角度不同,总结出的类是截然不同的
在现实世界中:先有的一个个具体存在的对象,然后随着人类文明的发展才有了分类的概念
在程序中:必须先定义类,后调用类来产生对象
现实世界中对对象==》总结出现实世界中的类==》定义程序中的类==》调用类产生程序中的对象
站在老男孩选课系统的角度,先总结现实世界中的老男孩的学生对象(这些对象有相似的特征和技能)
对象1:
特征:
学校='oldboy'
姓名='耗哥'
年龄=18
性别='male'
技能:
选课
对象2:
特征:
学校='oldboy'
姓名='猪哥'
年龄=17
性别='male'
技能:
选课
对象3:
特征:
学校='oldboy'
姓名='帅翔'
年龄=19
性别='female'
技能:
选课
站在老男孩选课系统的角度,先总结现实世界中的老男孩学生类
老男孩学生类:
相似的特征:
学校='oldboy'
相似的技能
选课
简单例子
class Car: #定义一个类,执行类体代码
def run(self):
pass
def driver(self,name): #在类的名称空间产生一个函数属性的名字(技能)
print("%s在开车" %name)
bmw= Car() # 实例化(调用类)产生一个空对象,对象就是一个名称名称空间,就是用来存放一堆自己独有的数据属性的
#对象本质也就是一个名称空间而已,对象名称空间(容器)是用存放对象自己------独有的名字/属性,而
#类中存放的是对象们---------------------------------------------------共有的属性
定义一个连接mysql的类
import pymysql
class Db:
# 第一个方法-连mysql
def connect(self):
db_info = {', 'host': '118.24.3.40',
'db': 'jxz', 'port': 3306, 'charset': 'utf8', 'autocommit': True}
self.conn = pymysql.connect(**db_info) # 建立连接
self.cur = self.conn.cursor()
def excute_many(self, sql):
self.cur.execute(sql)
return self.cur.fetchmany()
def excute_one(self, sql):
self.cur.execute(sql)
return self.cur.fetchone()
def excute_all(self, sql):
self.cur.execute(sql)
return self.cur.fetchall()
def close(self):
self.close()
self.cur.close()
def export_excel(self, table_name):
pass
mysql = Db()
2.2 python中的self (本类对象)
首先,对于python,只有针对类来说的self才有意义,所以python中的self,说的即是python类中的self。
# class Student(object):
# pass
class Person: # 经典类
# 属性就是变量
# 功能就是函数
def __init__(self, uid, name):
print('self的内存地址:', id(self))
self.id = uid
self.name = name
def cook(self):
print('%s 会做鱼香肉丝' % self.name)
def housework(self):
print('%s 正在做家务' % self.name)
xh = Person(1, '小黑')
xh.housework()
xb = Person(2, '小白')
xb.cook()
self的内存地址: 2215143160968 小黑 正在做家务 self的内存地址: 2215143161192 小白 会做鱼香肉丝
2.3 构造函数
构造函数,类在实例化的时候会自动执行构造函数
def __init__(self):
import pymysql
class Db:
# 第一个方法-连mysql
def __init__(self, host, user, password, db, port=3306, charset='utf8'):
# 构造函数,类在实例化的时候会自动执行构造函数
self.db_info = {
'user': user,
'password': password,
'db': db,
'port': port,
'charset': charset,
'autocommit': True,
'host': host}
self.connect()
def check_mysql_connect(self):
pass
def connect(self):
db_info = {', 'host': '118.24.3.40',
'db': 'jxz', 'port': 3306, 'charset': 'utf8', 'autocommit': True}
self.conn = pymysql.connect(**db_info) # 建立连接
self.cur = self.conn.cursor()
def excute_many(self, sql):
self.cur.execute(sql)
return self.cur.fetchmany()
def excute_one(self, sql):
self.cur.execute(sql)
return self.cur.fetchone()
def excute_all(self, sql):
self.cur.execute(sql)
return self.cur.fetchall()
def close(self):
self.close()
self.cur.close()
def export_excel(self, table_name):
pass
mysql = Db(', 'jxz')
result = mysql.excute_one('select * from %s' % table_name)
raise Exception 发现异常时,能通过它返回具体异常提示,方便检查错误
def connect(self):
try:
self.conn = pymysql.connect(**self.db_info)
except Exception as e:
print("连接不上数据库")
raise Exception("连接不上数据库,请检查连接")
# raise Exception
2.3 面向对象 三大特性
封装、继承、多态
1、封装 也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
2、继承 是面向对象程序设计方法的一个重要手段,通过继承可以更有效地组织程序结构,明确类间的关系,育雏利用已有的类来完成更复杂、更深入的程序开发。
3、多态 允许以一种统一的风格处理已存在的变量和相关的类,多态性使得向系统增加功能变的容易。
python语言(七)面向对象、异常处理的更多相关文章
- Python语言之面向对象
Python语言之面向对象 前言 面向对象 -- Object Oriented 简写:OO 面向对象设计 -- Object Oriented Design 简写:OOD 面向对象编程 -- Obj ...
- 简明python教程七----面向对象的编程
根据操作数据的函数或语句块来设计程序的,被称为面向过程的编程. 把数据和功能结合起来,用称为对象的东西包裹起来的组织程序的方法,称为面向对象的编程理念. 类和对象是面向对象编程的两个主要方面.类创建一 ...
- 简明python教程七----面向对象的编程(下)
继承:类之间的类型和子类型关系 代码重用:SchoolMember类被称为 基本类或超类,而Teacher和Student类被称为导出类或者子类 #!/usr/bin/python #Filename ...
- 比较分析C++、Java、Python、R语言的面向对象特征,这些特征如何实现的?有什么相同点?
一门课的课后题答案,在这里备份一下: 面向对象程序设计语言 – 比较分析C++.Java.Python.R语言的面向对象特征,这些特征如何实现的?有什么相同点? C++ 语言的面向对象特征: 对象模 ...
- 简学Python第七章__class面向对象高级用法与反射
Python第七章__class面向对象高级用法与反射 欢迎加入Linux_Python学习群 群号:478616847 目录: Python中关于oop的常用术语 类的特殊方法 元类 反射 一.P ...
- Python 全栈开发七 面向对象
一.编程范式 编程是程序员用特定的语法+数据结构+算法组成的代码来告诉计算机如何执行任务的过程 , 一个程序是程序员为了得到一个任务结果而编写的一组指令的集合,正所谓条条大路通罗马,实现一个任务的方式 ...
- Python第十一天 异常处理 glob模块和shlex模块 打开外部程序和subprocess模块 subprocess类 Pipe管道 operator模块 sorted函数 os模块 hashlib模块 platform模块 csv模块
Python第十一天 异常处理 glob模块和shlex模块 打开外部程序和subprocess模块 subprocess类 Pipe管道 operator模块 sorted函 ...
- Python第七天 函数 函数参数 函数里的变量 函数返回值 多类型传值 函数递归调用 匿名函数 内置函数
Python第七天 函数 函数参数 函数里的变量 函数返回值 多类型传值 函数递归调用 匿名函数 内置函数 目录 Pycharm使用技巧(转载) Python第一天 ...
- Python语言编程基础
Python 技能目标 理解编程基本原理和思想 掌握python语言的基础语法 能够使用python进行基本的开发工作 熟练使用项目开发IDE:eclipse,PyDev 能够使用Python开发简单 ...
随机推荐
- x58平台 服务器电源配置 tdp
我的机器配置: 处理器: Intel(R) Xeon(R) CPU X5660 @ 2.80GHz *2主板: TYAN Tyan Tank GT20-B7002LN ...
- SpringBoot集成Spring Security(2)——自动登录
在上一章:SpringBoot集成Spring Security(1)——入门程序中,我们实现了入门程序,本篇为该程序加上自动登录的功能. 文章目录 一.修改login.html二.两种实现方式 2. ...
- Cobalt环境搭建及 Web开发注意事项
一.在Linux系统上搭建Cobalt运行环境 Cobalt是一款开源轻量级HTML5/CSS/JS浏览器,旨在于用最少的CPU.GPU.RAM等资源消耗提供丰富的应用程序开发.为了使前端开发者验证自 ...
- RabbitMQ操作代码封装
1.Message.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; u ...
- Java连载15-boolean类型&类型转换&++运算符
一.boolean类型 1.说明: (1)在java语言中,boolean类型只有两个值:true.false,没有其他的值.在C语言中,是有0代表false和1代表true的 (2)在底层存储的时候 ...
- 是的 你没看错!!!用JAVA为MCU开发物联网程序?
是的 你没看错!!!用JAVA为MCU开发物联网程序? 一直以来,物联网设备这种嵌入式硬件,对于Java软件开发者来说,就是Black Magic Box,什么中断.寄存器,什么 ...
- 阿里云服务器ECS安全组设置 允许ping
另外也需要服务器的设置允许ping
- springmvc全局异常处理ControllerAdvice区分返回响应类型是页面还是JSON
思路: 加一个拦截器,在preHandler中取得HandlerMethod,判断其方法的返回类型,以及方法的注解和类的注解. 如果返回是json,收到异常则返回默认的异常包装类型. 如果返回是页面, ...
- Centos 7搭建Gitlab服务器超详细Centos 7搭建Gitlab服务器超详细(搭建成功)
一. 安装并配置必要的依赖关系在CentOS系统上安装所需的依赖:ssh,防火墙,postfix(用于邮件通知) ,wget,以下这些命令也会打开系统防火墙中的HTTP和SSH端口访问. 注意:用户不 ...
- 关于IDEA中web项目中web.xml配置文件标红的解决办法
原文链接 https://blog.csdn.net/qq_33451695/article/details/86684127 解决方法前提:web.xml没有实际错误,但依然被web.xml标红 出 ...