python异常(高级) Exception

异常(高级) Exception

  异常回顾:
    try-except 语句 捕获(接收)异常通知,把异常流程变为正常流程
    try-finally 语句 执行必须要执行的语句.
    raise 语句 发送异常通知,同时进入异常流程
    assert 语句 发送AssertionError异常
    with 语句

with语句
  语法:
    with 表达式1 [as 变量1], 表达式2 [as 变量2], ...:
      语句块
  作用:
  使用于对资源进行访问的场合,确保使用过程中不管是否发生异常都会执行必要的清理操作,并释放资源
  如: 文件使用后自动关闭,线程中锁的自动获取和释放等

  try:# file = open("../day19.txt")with open('../day19.txt') as file:line1 = file.readline()print("第一行内容是:", line1)n = int(line1) # with语句保证在出异时,文件也能被关闭print(n)except OSError:print("文件打开失败")except ValueError:print('读写文件时出错')
View Code

说明:
  with语句同try-finally语句一样,不会改变程序的状态(异常或正常状态) 

环境管理器:
  类内有'__enter__' 和 '__exit__' 实例方法的类被称为环境管理器能够用with语句进行管理的对象必须是环境管理器
  __enter__将在进入with语句之前被调用,并返回由as 变量管理的对象
  __exit__ 将在离开with语句时被调用,且可以用参数来判断在离开with语句时是否有异常发生并做出相应的处理

  class A:def __enter__(self):print("__enter__方法被调用")# 此处打开文件return self # self 将被with as后的变量绑定def __exit__(self, exc_type, exc_val, exc_tb):print("__exit__方法被调用")# 此处关闭文件if exc_type is None:print("正常离开with语句")else:print("异常离开with语句")print(exc_type, exc_val, exc_tb)try:with A() as a:print("这是with内的语句")err = ValueError("故意抛出一个错误")raise errexcept ValueError:print("with语句内出现异常!!")
View Code

异常类:
  BaseExcetion 类是一切异常类的基类
  自定义的异常类型必须直接或间接的继承自BaseExcetion类

运算符重载
  让自定义的类生成的对象(实例) 能够使用运算符进行操作

  作用:
    让自定义类的实例像内建对象一样进行运算符操作
    让程序简洁易读
    对自定义对象将运算符赋予新的运算规则

  说明:
    运算符已经有固定的含义,不建议改变原有运算符的含义
  方法名          运算符和表达式    说明
  __add__(self, rhs)    self + rhs      加法
  __sub__(self, rhs)    self - rhs      减法
  __mul__(self, rhs)    self * rhs      乘法
  __truediv__(self, rhs)  self / rhs      除法
  __floordiv__(self, rhs)  self // rhs      地板除法
  __mod__(self, rhs)    self % rhs      求余
  __pow__(self, rhs)    self ** rhs      幂运算

  rhs (right hand side)   右手边

二元运算符的重载方法:
  def __xxx__(self, other):
    ...

  class MyNumber:def __init__(self, value):self.data = valuedef __repr__(self):return "MyNumber(%d)" % self.datadef __add__(self, other):temp = self.data + other.dataobj = MyNumber(temp) # 创建一个新的对象return objdef __sub__(self, other):temp = self.data - other.dataobj = MyNumber(temp) # 创建一个新的对象return objn1 = MyNumber(100)n2 = MyNumber(200)# n3 = n1.__add__(n2)
n3 = n1 + n2 # 等同于 n3 = n1.__add__(n2)print(n1, "+", n2, '=', n3)n4 = n1 - n2print(n1, "-", n2, '=', n4)
View Code

反向算术运算符的重载
  当运算符的左侧为内建类型时,右侧为自定义类的对象进行算术运算符运算时,会出现TypeError错误,因无法修改内建类型的代码来实现运算符重载,此时需要反向算术运算符重载

方法如下:
  方法名           运算符和表达式    说明
  __radd__(self, lhs)    lhs + self      加法
  __rsub__(self, lhs)    lhs + self      减法
  __rmul__(self, lhs)    lhs * self      乘法
  __rtruediv__(self, lhs)  lhs / self      除法
  __rfloordiv__(self, lhs)  lhs // self      地板除法
  __rmod__(self, lhs)    lhs % self      求余
  __rpow__(self, lhs)    lhs ** self      幂运算

  lhs (left hand side)    左手边

  class MyList:def __init__(self, iterable=()):self.data = [x for x in iterable]def __add__(self, rhs):L = self.data + rhs.datareturn MyList(L)def __repr__(self):return "MyList(%s)" % self.datadef __mul__(self, rhs):L = self.data * rhsreturn MyList(L)def __rmul__(self, lhs):print("__rmul__被调用")return MyList(self.data * lhs)L1 = MyList(range(1, 4))L2 = MyList([4, 5, 6])L5 = L1 * 2 # L5 = L1.__mul__(2)print(L5) # MyList([1, 2, 3, 1, 2, 3])
L6 = 2 * L1 # L1.__rmul__(2) 2.__mul__(L1)print(L6) # ???
View Code

复合赋值算术运算符的重载
  以复合赋值算述运算符 x += y 主为例,此运算符会优先调用x.__iadd__(y) ,如果没有__iadd__方法时,会将复合赋值运算符拆解为 x = x + y然后调用x = x.__add__(y)方法,如再不存在__add__方法,则会触发TypeError错误
  其它复合赋值运算符有相同的规则

  方法名           运算符和表达式   说明
  __iadd__(self, rhs)    self += rhs    加法
  __isub__(self, rhs)    self -= rhs    减法
  __imul__(self, rhs)    self *= rhs    乘法
  __itruediv__(self, rhs)  self /= rhs    除法
  __ifloordiv__(self, rhs)  self //= rhs    地板除法
  __imod__(self, rhs)    self %= rhs    求余
  __ipow__(self, rhs)    self **= rhs    幂运算

  rhs (right hand side)   右手边

  class MyList:def __init__(self, iterable=()):self.data = [x for x in iterable]def __repr__(self):return "MyList(%s)" % self.datadef __add__(self, rhs):print("__add__")L = self.data + rhs.datareturn MyList(L)# def __iadd__(self, rhs):# print("__iadd__")# self.data += rhs.data# return self
L1 = MyList(range(1, 4))L2 = MyList([4, 5, 6])print("+= 之前的 id(L1)", id(L1))L3 = L1L1 += L2print("+= 之后的 id(L1)", id(L1))print(L1)print(L3)
View Code

比较运算符的重载
  方法名         运算符和表达式   说明
  __lt__(self, rhs)    self < rhs     小于
  __le__(self, rhs)    self <= rhs    小于等于
  __gt__(self, rhs)    self > rhs     大于
  __ge__(self, rhs)    self >= rhs    大于等于
  __eq__(self, rhs)    self == rhs    等于
  __ne__(self, rhs)    self != rhs    不等于

注: 比较运算符通常返回布尔值 True 或 False

位运算符的重载
  方法名          运算符和表达式  说明
  __and__(self, rhs)    self & rhs     位与
  __or__(self, rhs)     self | rhs    位或
  __xor__(self, rhs)    self ^ rhs    位异与
  __lshift__(self, rhs)   self << rhs    左移
  __rshift__(self, rhs)   self >> rhs    右移

反向位运算符的重载
  方法名          运算符和表达式  说明
  __rand__(self, lhs)    lhs & self    位与
  __ror__(self, lhs)    lhs | self    位或
  __rxor__(self, lhs)    lhs ^ self    位异与
  __rlshift__(self, lhs)  lhs << self    左移
  __rrshift__(self, lhs)  lhs >> self    右移

复合赋值位运算符的重载
  方法名          运算符和表达式   说明
  __iand__(self, rhs)    self &= rhs    位与
  __ior__(self, rhs)    self |= rhs    位或
  __ixor__(self, rhs)    self ^= rhs    位异与
  __ilshift__(self, rhs)  self <<= rhs    左移
  __irshift__(self, rhs)  self >>= rhs    右移


一元运算符的重载
  方法名        运算符和表达式  说明
  __neg__(self)    -self      负号
  __pos__(self)    +self      正号
  __invert__(self)   ~self       取反

一元运算符的重载语法:
  class 类名:
    def __xxx__(self):
      ...

  class MyList:def __init__(self, iterable=()):self.data = [x for x in iterable]def __repr__(self):return "MyList(%s)" % self.datadef __neg__(self):return MyList([-x for x in self.data])L1 = MyList([1, -2, 3, -4, 5])L2 = -L1print(L2) # MyList([-1, 2, -3, 4, -5])
View Code

in , not in 运算符的重载
  方法名          运算符和表达式  说明
  __contains__(self, e)   e in self     成员运算

  class MyList:def __init__(self, iterable=()):self.data = [x for x in iterable]def __repr__(self):return "MyList(%s)" % self.datadef __contains__(self, item):return item in self.dataL1 = MyList([1, -2, 3, -4, 5])if 3 in L1:print("")else:print("")print(3 not in L1)
View Code

索引和切片运算符的重载:
  重载方法
  方法名          运算符和表达式   说明
  __getitem__(self, i)   x = self[i]    索引/切片取值
  __setitem__(self, i, v) self[i] = v    索引/切片赋值
  __delitem__(self, i)   del self[i]    删除索引/切片

作用:
  让自定义的类型的对象能够支持索引和切片操作

  class MyList:def __init__(self, iterable=()):self.data = [x for x in iterable]def __repr__(self):return "MyList(%s)" % self.datadef __getitem__(self, item):print("__getitem__", item)return self.data[item]def __setitem__(self, key, value):print("__setitem__(key=", key, ',value=', value,')')self.data[key] = valuedef __delitem__(self, key):print('正在删除第', key, '个元素')L1 = MyList([1, -2, 3, -4, 5])v = L1[2] # 调用 v = L1.__getitem__(2)print(v) # 3L1[1] = 2 # 调用 L1.__setitem__(1, 2)print(L1)del L1[3] # 调用 L1.__delitem__(3)
View Code
  class MyList:def __init__(self, iterable=()):self.data = [x for x in iterable]def __repr__(self):return "MyList(%s)" % self.datadef __getitem__(self, item):print("__getitem__:", item)if type(item) is int:print("正在做索引操作,item=", item)elif type(item) is slice:print("正在做切片操作:")print("起始值:", item.start)print("终止值:", item.stop)print("步长:", item.step)return self.data[item]L1 = MyList([1, -2, 3, -4, 5])v = L1[1::2]print(v)v = L1[3]print(v)# L1[1:2:3] = [4, 5, 6]# L1.__setitem__(slice(1, 2, 3), [4, 5, 6])
View Code

slice 构造函数
  作用:
    用于创建一个slice切片对象,此对象存储一个切片的起始值,终止值,步长信息
  格式:
    slice(start=None, stop=None, step=None)
  slice对象的实例属性
    s.start 切片的起始值,默认为None
    s.stop 切片的终止值,默认为None
    s.step 切片的步长,默认为None

 

特性属性 @property
  实现其它语言所拥有的getter 和 setter功能
作用:
  用来模拟一个属性
  通过@property装饰器可以对模拟属性赋值和取值加以控制

  class Student:def __init__(self, s):self.__score = s # 成绩
@propertydef score(self):'''getter'''return self.__score@score.setterdef score(self, new_score):'''setter'''assert 0 <= new_score <= 100, '成绩不合法'self.__score = new_scores1 = Student(50)print(s1.score)s1.score = 999 # 用setter来控制赋值操作print(s1.score)
View Code

 

转载于:https://www.cnblogs.com/zhaoyang1997/p/10747211.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/387814.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从BMW Vision iNEXT 看宝马如何进军自动驾驶

安全很重要&#xff0c;空间也要很大&#xff0c;砍掉大量物理按键&#xff0c;内饰材料要环保&#xff0c;还要提供自动和主动两套驾驶方案。这些描述仅是BMW Vision iNEXT&#xff08;下称Vision iNEXT&#xff09;概念车的设计之冰山一角。 一款概念车当然无法完全代表未来…

CSS浮动(二)---Float

重新认识float 2.1. 误解和“误用” 既然提到“误用”&#xff0c;各位看官就此想想&#xff0c;自己平日是怎么使用float的&#xff1f;另外&#xff0c;既然“误用”加了引号&#xff0c;就说明这样的使用并不是真正的误用&#xff0c;而是误打误撞使用之后&#xff0c;带…

云原生生态周报 Vol. 2

业界要闻 Kubernetes External Secrets 近日&#xff0c;世界上最大的域名托管公司 Godaddy公司&#xff0c;正式宣布并详细解读了其开源的K8s外部 Secrets 管理项目&#xff1a; Kubernetes External Secrets&#xff0c;简称KES。这个项目定义了ExternalSecrets API&#xff…

centos 7新机使用前操作

关闭防火墙 systemctl stop firewalld&#xff08;停服务&#xff09; systemctl status firewalld&#xff08;看状态&#xff09; systemctl disable firewalld.service &#xff08;永久关闭&#xff09; selinux getenforce&#xff08;查状态&#xff09; vi /etc/selinux…

软件架构演进

传统架构到分布式架构详解 软件架构演进软件架构的发展经历了从单体架构、垂直架构、SOA架构到微服务架构的过程&#xff0c;博客里写到了这四种架构的特点以及优缺点分析&#xff0c;个人学习之用&#xff0c;仅供参考&#xff01; 1.1.1 单体架构 特点&#xff1a;1、所有的…

hadoop0.20.0第一个例子

这是Hadoop学习全程记录第2篇&#xff0c;在这篇里我将介绍一下如何在Eclipse下写第一个MapReduce程序。 新说明一下我的开发环境&#xff1a; 操作系统&#xff1a;在windows下使用wubi安装了ubuntu 10.10 hadoop版本&#xff1a;hadoop-0.20.2.tar.gz Eclipse版本&…

IDEA 修改JavaWeb的访问路径

问题描述 对于我这个刚刚使用IDEA不久的新手来说&#xff0c;能够正常运行就不错了,不过到了后面&#xff0c;可能会觉得IDEA给你分配的默认访问路径很不顺手&#xff0c;比如访问的时候需要通过: http://localhost:8080/web_war_exploded/ 来访问&#xff0c;对于web_w…

做一个vue的todolist列表

<template><div id"app"><input type"text" v-model"todo" ref"ip"/><button click"add()">新增</button><br/><br/><hr/><ul><li v-for"(item,key) in li…

一种解决 MacBook 里的 App Store 无法登录的问题

刚刚买回来的 2018 款带有 touchbar 的 MacBook Pro 15 inc 在用 App Store 安装 app 时一直无法登录成功&#xff08;网络链接都是好的&#xff09;&#xff0c;导致软件都无法更新&#xff0c;折腾了挺一会的。 后来发现是要退出设置里的 iCloud 登录&#xff0c;然后重新登录…

第二次冲刺

1、今日各个成员的问题 组员问题张晋誌对mui的API看得不是很懂&#xff0c;无法顺利的使用袁庆杰基础不牢,编写困难周建峰eclipse没法创建web项目&#xff0c;按照网上的方法&#xff0c;check for updates 和 install new software 之后也没用许家烨给单一功能知道如何实现但项…

单纯形法

单纯形法 如果目标函数中所有系数都非正&#xff0c;那么显然这些变量直接取0是最优的&#xff0c;所以此时答案为即为常数项。 我们要做的就是通过转化把目标函数的系数全部搞成非负。 思路就是用非基变量替换基变量。 先找到一个目标函数中系数为正的变量&#xff0c;在所有限…

分布式数据库数据一致性的原理、与技术实现方案

http://youzhixueyuan.com/the-principle-and-technology-realization-of-distributed-data-consistency.html 背景 可用性&#xff08;Availability&#xff09;和一致性&#xff08;Consistency&#xff09;是分布式系统的基本问题&#xff0c;先有著名的CAP理论定义过分布式…

模块之re模块 —— 正则

#‘match’只匹配从左向右第一个值是否在中括号的范围内&#xff0c;如果没有就返回None 如果有就直接打印一个对象&#xff0c;加上.group()就可以返回你要找的区间里面的值&#xff0c;如果没有找到对应的值&#xff0c;加上‘.group()’会报错 #‘search’ 默认是从整个st…

centos7 docker

Docker 是一个开源工具&#xff0c;它可以让创建和管理 Linux 容器变得简单。容器就像是轻量级的虚拟机&#xff0c;并且可以以毫秒级的速度来启动或停止。Docker 帮助系统管理员和程序员在容器中开发应用程序&#xff0c;并且可以扩展到成千上万的节点。 容器和 VM&#xff08…

Intellij Idea 2017创建web项目及tomcat部署实战

相关软件&#xff1a;Intellij Idea2017、jdk16、tomcat7 Intellij Idea直接安装&#xff08;可根据需要选择自己设置的安装目录&#xff09;&#xff0c;jdk使用1.6/1.7/1.8都可以&#xff0c;主要是配置好系统环境变量&#xff0c;tomcat7上tomcat的官网下载压缩包解压即可。…

docker ssh

1&#xff0c;首先&#xff0c;需要从Docker官网获得centos或Ubuntu镜像 2&#xff0c;当本地已有Ubuntu镜像后&#xff08;大概200M左右大小&#xff09;&#xff0c;使用如下命令 [cpp]view plaincopy docker run -t -i ubuntu /bin/bash 即可启动一个容器&#xff0c;并放…

[BFS]JZOJ 4672 Graph Coloring

Description 现在你有一张无向图包含n个节点m条边。最初&#xff0c;每一条边都是蓝色或者红色。每一次你可以将一个节点连接的所有边变色&#xff08;从红变蓝&#xff0c;蓝变红&#xff09;。找到一种步数最小的方案&#xff0c;使得所有边的颜色相同。Input 第一行包含两个…

JAVA的值传递问题

为什么 Java 中只有值传递&#xff1f; 首先回顾一下在程序设计语言中有关将参数传递给方法&#xff08;或函数&#xff09;的一些专业术语。按值调用(call by value)表示方法接收的是调用者提供的值&#xff0c;而按引用调用&#xff08;call by reference)表示方法接收的是调…

2017 百度杯丶二月场第一周WP

1.祸起北荒 题目&#xff1a; 亿万年前 天子之子华夜&#xff0c;被父神之神末渊上神告知六荒十海之北荒西二旗即将发生一场“百度杯”的诸神之战 他作为天族的太子必须参与到此次诸神之战定六荒十海 华夜临危受命&#xff0c;马上带着火凤凰飞行到北荒“西二旗” 却没想到这六…