Python基础—13-面向对象及异常处理
面向对象及异常处理
内置函数
总结:
__init__、__del__、__str__、attr系列、item系列、__call__
__str__与__repr__
- 使用print/str方法时会自动触发
__str__
方法,当__str__
不存在,尝试__repr__
- 使用repr方法时会自动触发
__repr__
方法 - repr方法通常用于返回对象的字符串表示形式
- 这两个方法都只能返回字符串
- eval方法可以将一个字符串当做有效的代码执行
- 使用print/str方法时会自动触发
算术运算符重载
- 示例:
class Number:
def __init__(self, num):
self.num = num # 对象出现在'+'左边时会自动触发
def __add__(self, other):
print('__add__')
return self.num + other # 对象出现在'+'右边是会自动触发
def __radd__(self, other):
print('__radd__')
return self.num + other # +=运算时会自动触发,没有时会触发 __add__
def __iadd__(self, other):
print('__iadd__')
return Number(self.num + other) n = Number(100)
ret = n + 200
ret = 200 + n
print(ret)
n += 200 # n = n + 200
print(n)- 自己测试
加法:__add__、__radd__、__iadd__
减法:__sub__、__rsub__、__isub__
乘法:__mul__、__rmul__、__imul__
除法:__truediv__、__rtruediv__、__itruediv__
求余:__mod、__rmod__、__imod__
关系运算符重载
>: __gt__
=: __ge__
<: __lt__
<=: __le__
==: __eq__
!=: __ne__
示例
class Number:
def __init__(self, num):
self.num = num def __gt__(self, other):
print('__gt__')
return self.num > 200 def __lt__(self, other):
print('__lt__')
return self.num < other def __eq__(self, other):
print('__eq__')
return self.num == other # 当没有此方法时,使用!=也会触发__eq__方法
def __ne__(self, other):
print('__ne__')
return self.num != other n = Number(100) # print(n > 200)
# print(200 > n)
# print(200 == n)
print(200 != n)
深浅拷贝
引用计数
- python中的所有变量都是对象,对象的管理采用的时引用计数的方式
- 当多一个变量指向对象计数值加1,当少一个变指向对象计数值减1,减到0是,释放对象(
__del__
)
函数传参
- 对于不可变的变量来说,函数中不可能改传递过来的变量
- 对于可变的容器对象及自定义对象,作为函数参数传递时,传递的是引用,可以修改该对象
深浅拷贝
class Person:
def __del__(self):
print('对象释放') p1 = Person()
p2 = p1 print(id(p1))
print(id(p2)) del p1
del p2
print('OVER') def test(m):
# m += 1
m[0] = 300 # n = 100
n = [100, 200] test(n)
print(n) import copy lt = [1, 2, [3, 4]] # 浅拷贝,只拷贝对象本身,不拷贝对象中的元素
# lt2 = lt.copy()
# 浅拷贝
lt2 = copy.copy(lt) # 深拷贝:不但拷贝对象本身,还拷贝对象中的元素
lt2 = copy.deepcopy(lt)
lt[0] = 100
lt2 = 300 print(id(lt))
print(id(lt2))
print(lt)
print(lt2)
数据持久化(pickle)
说明:数据持久化存储方案,普通文件、序列化、数据库
示例:
import pickle class Person:
def __init__(self, name, age):
self.name = name
self.age = age def __str__(self):
return 'name:{},age:{}'.format(self.name, self.age) xiaoming = Person('xiaoming', 20)
# 转换为bytes类型 # s = pickle.dumps(xiaoming)
# print(s) # 从字节流中提取对象
# xm = pickle.loads(s) # print(xm)
# 保存到文件中
# fp = open('data.txt', 'wb') # pickle.dump(xiaoming, fp)
# 从文件中获取对象 fp = open('data.txt', 'rb')
xm = pickle.load(fp)
print(xm)
异常处理
相关概念
- 错误:程序运行之前的语法问题,如:关键字、缩进、括号不成对等
- 异常:在程序运行过程中出现的问题,如:未定义变量、除数为0、属性不存在等
异常处理
- 说明:异常处理可以理解为特殊的流程控制语句,可以提高代码的健壮性。
异常语法:
try:
print('正常代码')
# print(a)
3/0
except Exception as e:
# Exception 是所有异常的基类,此处可以捕获所有的异常
print('出现异常')
print(e) print('其他内容')
多个异常
# 分类捕获异常
'''
try:
# print(a)
# 3/0
d = {}
print(d['name'])
except NameError as e:
print('NameError:', e)
except ZeroDivisionError as e:
print('ZeroDivisionError:', e)
except Exception as e:
print('OtherError:', e)
''' try:
# print(a)
# 3/0
fp = open('123.txt')
except (NameError, ZeroDivisionError) as e:
# 将某些异常进行统一处理,写在一个元组中即可
print(e)
except:
print('其他异常')完整结构(else-finally)
try:
print('正常代码')
print(a)
except:
# 出现异常时执行
print('出现异常')
else:
# 正常结束(没有异常)时会执行
print('正常结束')
finally:
# 无论有无异常,都会执行
print('最后执行')else:正常结束时执行else中的代码
finally:无论有无异常,最后都执行
抛出异常:
raise
try:
print('正常代码')
# 根据业务逻辑的需要,手动抛出异常
raise Exception('手动抛出的异常')
except Exception as e:
print('异常:', e) print('OVER')异常嵌套(try-except结构中再次使用try-except结构)
print('我要去上班,什么事也阻止不了我上班的脚步')
try:
print('我准备骑电动车')
raise Exception('昨天晚上不知道哪个缺德的家伙把我充电器拔了')
print('骑车提前到达公司')
except Exception as e:
print(e)
try:
print('我准备做公交车')
raise Exception('等了20分钟一直没有公交车,果断放弃')
print('坐公交车准时到达公司')
except Exception as e:
print(e)
print('我准备打车')
print('打车还是快,一会就到达公司') print('热情满满的开始一天的工作')自定义异常类(需要继承自官方的异常基类Exception)
# 自定义异常类
class MyException(Exception):
def __init__(self, msg):
self.msg = msg def __str__(self):
return self.msg # 特定异常标准处理方案
def deal(self):
print('处理特定的自定义异常') try:
print('正常执行')
# 手动抛出自定义异常
raise MyException('出现了自定义异常')
except MyException as e:
print(e)
# 调用方法,处理异常
e.deal()
特殊场景
- 当我们进行文件操作时,无论过程中是否有异常,最终我们一定得进行关闭操作
- 使用with语句,可以保证文件的关闭,无论中间过程是否出现异常
# fp = open('test.txt', 'r')
# 中间无论有无异常,最后一定得关闭文件
# fp.close() with open('test.txt', 'r') as fp:
content = fp.read(5)
print(content)
# 此处不要考虑文件的关闭问题,也不用是否有异常
虚拟环境
- 为什么使用虚拟环境?
- 当一台电脑上不同软件需要依赖同一个包的不同版本时,为了进行环境隔离就出现了虚拟环境
- 安装工具:
virtualenv
pip install virtualenv
- 创建虚拟环境
virtualenv 虚拟环境目录名
- 激活虚拟环境
- 进入虚拟环境目录的
Scripts
目录 - 执行:
activate
- 进入虚拟环境目录的
- 退出虚拟环境
- 进入虚拟环境目录的
Scripts
目录 - 执行:
deactivate.bat
- 进入虚拟环境目录的
- 冷冻一个环境依赖包
- 执行:
pip freeze > requirements.txt
- 执行:
- 快速复制一个虚拟环境
- 创建一个虚拟环境
- 激活虚拟环境
- 执行:
pip install -r requirements.txt
Python基础—13-面向对象及异常处理的更多相关文章
- Python 基础之面向对象之异常处理
一.认识异常 1.常用异常报错的错误类型 IndexError 索引超出序列的范围 KeyError 字典中查找一个不存在的关键字 Na ...
- python基础(13)-面向对象
类 类的定义和使用 # class Person: def __init__(self, name, age, gender): self.name = name self.age = age sel ...
- Python 基础 四 面向对象杂谈
Python 基础 四 面向对象杂谈 一.isinstance(obj,cls) 与issubcalss(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls ...
- python基础,函数,面向对象,模块练习
---恢复内容开始--- python基础,函数,面向对象,模块练习 1,简述python中基本数据类型中表示False的数据有哪些? # [] {} () None 0 2,位和字节的关系? # ...
- (转)Python成长之路【第九篇】:Python基础之面向对象
一.三大编程范式 正本清源一:有人说,函数式编程就是用函数编程-->错误1 编程范式即编程的方法论,标识一种编程风格 大家学习了基本的Python语法后,大家就可以写Python代码了,然后每个 ...
- [.net 面向对象编程基础] (13) 面向对象三大特性——多态
[.net 面向对象编程基础] (13) 面向对象三大特性——多态 前面两节,我们了解了面向对象的的封装和继承特性,面向对象还有一大特性就是多态.比起前面的封装和继承,多态这个概念不是那么好理解.我们 ...
- 自学Python之路-Python基础+模块+面向对象+函数
自学Python之路-Python基础+模块+面向对象+函数 自学Python之路[第一回]:初识Python 1.1 自学Python1.1-简介 1.2 自学Python1.2-环境的 ...
- 二十. Python基础(20)--面向对象的基础
二十. Python基础(20)--面向对象的基础 1 ● 类/对象/实例化 类:具有相同属性.和方法的一类人/事/物 对象(实例): 具体的某一个人/事/物 实例化: 用类创建对象的过程→类名(参数 ...
- 十三. Python基础(13)--生成器进阶
十三. Python基础(13)--生成器进阶 1 ● send()方法 generator.send(value) Resumes the execution, and "sends&qu ...
- Day7 - Python基础7 面向对象编程进阶
Python之路,Day7 - 面向对象编程进阶 本节内容: 面向对象高级语法部分 经典类vs新式类 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 作业:开发一个 ...
随机推荐
- js跑步算法
<!DOCTYPE html> <html> <head> <title>JavaScript</title> <style> ...
- jQuery Custom PopUp Window
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- ASP.NET 中对大文件上传的简单处理
在 ASP.NET 开发的过程中,文件上传往往使用自带的 FileUpload 控件,可是用过的人都知道,这个控件的局限性十分大,最大的问题就在于上传大文件时让开发者尤为的头疼,而且,上传时无法方便的 ...
- matlab练习程序(结构张量structure tensor)
根据结构张量能区分图像的平坦区域.边缘区域与角点区域. 此算法也算是计算机科学最重要的32个算法之一了.链接的文章中此算法名称为Strukturtensor算法,不过我搜索了一下,Strukturte ...
- 在同一网关下ping不通其他电脑
最近在做数据库相关的程序,所以想先用ping试下和主机连没连着,但发现虽然两台电脑在同一网关下,但却互相ping不通,后来才发现,原来是防火墙在作怪. Omg!感慨一下!默认的情况下,保守的windo ...
- 使用describe命令进行Kubernetes pod错误排查
我有一个pod名叫another,用kubectl create创建后发现过了29分钟,状态还是处于ContainerCreating阶段. 使用kubectl describe命令检查: 从错误消息 ...
- 从产品展示页面谈谈Hybris系列之二: DTO, Converter和Populator
文章作者:张健(Zhang Jonathan) 上一篇文章 从产品展示页面谈谈Hybris的特有概念和设计结构 我们讲解了Hybris一些特有的概念以及大体架构,并且介绍了Facade层里是如何定义D ...
- PCI PCI-X PCI-E介绍
1.PCI 外设互联标准(或称个人电脑接口,Personal Computer Interface),实际应用中简称PCI(Peripheral Component Interconnect),是一种 ...
- [转]查找问题的利器 - Git Bisect
转自:http://gitbook.liuhui998.com/5_4.html 假设你在项目的'2.6.18'版上面工作, 但是你当前的代码(master)崩溃(crash)了. 有时解决这种问题的 ...
- POJ 2942 圆桌骑士
之前做过这个题目,现在回想起来,又有新的柑橘. 求必须出去的骑士人数. 每一个双连通分量,如果是一个奇圈,那么一定是二分图染色失败. 依次遍历每个双连通分量,但是,对于邻接表中,有一些点不是双连通分量 ...