Py-上下文管理方法,描述符的应用,错误与异常
上下文管理方法:
可以在exit里面弄一些内存清理的功能
class Open:
def __init__(self,name):
self.name=name
def __enter__(self):
print('执行enter')
return self #enter返回self
def __exit__(self,exc_type,exc_val,exc_tb):
print('执行exit')
f=Open('a.txt') #直接使用时不触发
print('abcd')
with Open('a.txt') as f1: #with as时触发__enter__,然后把enter的返回值作为f1
print(f) #也就是self给了f,这里打印的是self的地址
print(f.name)
print('_____')
print('_____')
print('_____')
print('_____') #with as 完成时触发__exit__
可以看见一旦with as里面的代码块一旦出现异常直接触发exit
class Open:
def __init__(self,name):
self.name=name
def __enter__(self):
print('执行enter')
return self #enter返回self
def __exit__(self,exc_type,exc_val,exc_tb):
print('执行exit')
print(exc_type) #异常的种类
print(exc_val) #异常的值
print(exc_tb) #异常的追踪,不常用
f=Open('a.txt') #直接使用时不触发
print('abcd')
with Open('a.txt') as f1: #with as时触发__enter__,然后把enter的返回值作为f1
print(f) #也就是self给了f,这里打印的是self的地址
print(fafsadasdas) #可以看见一旦with as里面的代码块一旦出现异常直接触发exit
print('_____')
print('_____')
print('_____')
强行跳过异常
class Open:
def __init__(self,name):
self.name=name
def __enter__(self):
print('执行enter')
return self #enter返回self
def __exit__(self,exc_type,exc_val,exc_tb):
print('执行exit')
print(exc_type)
print(exc_val)
print(exc_tb)
return True
f=Open('a.txt') #直接使用时不触发
print('abcd')
with Open('a.txt') as f1: #with as时触发__enter__,然后把enter的返回值作为f1
print(f) #也就是self给了f,这里打印的是self的地址
print(fafsadasdas) #可以看见一旦with as里面的代码块一旦出现异常直接触发exit
print('_____')
print('_____')
print('_____')
print('ass')
描述符的应用:
1.使用描述符来给python加上输入数据的类型检测
class Typed:
def __get__(self,instance,owner):
print('get way')
print(instance)
print(owner)
def __set__(self, instance, value):
print('set way')
print(instance) #instance得到的是p1整个实例
print(value) #value得到的是对name写入的值
class People:
name=Typed() #name被描述符代理了
def __init__(self,name,age,salary):
self.name=name
self.age=age
self.salary=salary
#以下弄限制name传入必须是字符串,age必须是整数
#salary必须是浮点数
p1=People('alex',13,13) #实例化的时候对name进行写入
#由于name被代理了,,于是写入name会触发set
print(p1.__dict__) #可以看见里面没有name,因为它被代理了
p1.name='asdad' #设置也会触发set
2.在此基础上可以进行修改,使其具有set的设置值功能
class Typed:
def __init__(self,key,expect_type):
self.key=key
self.expect_type=expect_type
def __get__(self,instance,owner):
print('get way')
return instance.__dict__[self.key]
def __set__(self, instance, value):
print('set way')
print(self.key)
if isinstance(value,self.expect_type):
instance.__dict__[self.key]=value
else:
raise TypeError('你传入的不是字符串')
class People:
name=Typed('name',str) #name被描述符代理了,同时传入self.name
age = Typed('age',int)
def __init__(self,name,age,salary):
self.name=name
self.age=age
self.salary=salary
#以下弄限制name传入必须是字符串,age必须是整数
#salary必须是浮点数
p1=People('sasda',13,13) #输入字符串的时候没有报错
print(p1.__dict__)
类的装饰器:
装饰器也可以加到类上
def deco(obj):
print('-----',obj)
obj.x=1
obj.y=2
return obj
@deco
class Foo:
pass
print(Foo.__dict__)
利用描述符自制property
class diyproperty:
def __init__(self,func): #这里装载的是area的地址
self.func=func #func也就是area
print('aaaa')
def __get__(self, instance,owner):
print('触发get')
print('instance是那个r1实例',instance.wid)
print(instance.wid)
print(instance.len)
res=self.func(instance) #在这里可以执行area函数
return res
class room:
def __init__(self,name,wid,len):
self.name=name
self.wid=wid
self.len=len
@diyproperty #area=property(area), are被代理了
def area(self):
return self.wid * self.len
r1=room('cesuo',10,10) #将其实例化得到r1
print(r1.area) #r1.area不写括号直接触发代理的get
元类:
元类是类的类,是类的模板
元类就是type
错误与异常:
错误:语法错误和逻辑错误
异常:是程序运行发生错误时的跳出信号
attrierror试图访问没有的属性出错
ioerror输入输出异常
importerror无法引入模块或者包
keyerror试图访问字典里面不存在的键
keyboardinterrupt ctrl+c被按下
nameerror 使用了一个还未被复制的对象的变量
synataxerror python代码非法,语法错误
typeerror 传入类型和要求的不符合
unboundlocalerror 试图访问一个还未被设置的局部变量
valueerror传入一个调用者不期望的值
异常处理:在发生崩溃时进行异常处理操作,防止程序
直接跳出
1.如果错误发生的条件是可预知的,我们需要用if进行处理:在错误发生之前进行预防
AGE=10
while True:
age=input('>>: ').strip() #strip为去除空格
if age.isdigit(): #只有在age为字符串形式的整数时,下列代码才不会出错,该条件是可预知的
age=int(age)
if age == AGE:
print('you got it')
break
2.如果错误发生的条件是不可预知的,则需要用到try...except:在错误发生之后进行处理
基本语法为
try:
被检测的代码块
except 异常类型:
try中一旦检测到异常,就执行这个位置的逻辑
#举例
try:
a=input('输入一个数字')
a=int(a)
print(a)
except ValueError as wrong:
print('其实错了,应该被强退的')
print(wrong)
3.上面这是检查值错误的,下面这是检查尺寸错误的
try:
a=[123456]
print(a[10])
except IndexError as wrong:
print('其实错了,应该被强退的')
print(wrong)
4.由此这些可能会出现很多很多异常,不同的需要写不同的很麻烦
因此需要万能异常Exception,它哪种异常都能捕捉得到
try:
b='sata'
int(b)
a=[123456]
print(a[10])
except Exception as wrong:
print('其实错了,应该被强退的')
print(wrong)
5.如果需要不同的异常用不同的处理方式用多分支
s1 = 'hello'
try: #相应的异常先检测完,最后如果有没想到的异常用Exception吸收掉
int(s1)
except IndexError as e:
print(e)
except KeyError as e:
print(e)
except ValueError as e:
print(e)
except Exception as e:
print(e)
6.更加优良的结构
s1 = 'hello'
try:
int(s1)
except IndexError as e:
print(e)
except KeyError as e:
print(e)
except ValueError as e:
print(e)
except Exception as e:
print(e)
else:
print('try内代码块没有异常则执行我')
finally:
print('无论异常与否,都会执行该模块,通常是进行清理工作')
7. 主动触发异常(raise)
try:
raise TypeError('类型错误')
except Exception as e:
print(e)
8.自定义异常
class zqhException(BaseException):
def __init__(self,msg):
self.msg=msg
try:
raise zqhException('类型错误')
except zqhException as e:
print(e)
9.assert断言条件
assert res ==1
等同于
if res !=1:
raise AssertionError
相当于如果不是断言条件直接报错
Py-上下文管理方法,描述符的应用,错误与异常的更多相关文章
- NDK开发之获得域和方法描述符
在NDK开发之调用方法和NDK开发之访问域两篇博客中,我们在获得域ID和方法ID时都需要一个叫做描述符的参数,那么在实际开发中我们怎么知道我们要调用的域或者方法的描述符呢? 一个简单的方法就是使用Ja ...
- 进程管理—进程描述符(task_struct)
http://blog.csdn.net/qq_26768741/article/details/54348586 当把一个程序加载到内存当中,此时,这个时候就有了进程,关于进程,有一个相关的叫做进程 ...
- [一]FileDescriptor文件描述符 标准输入输出错误 文件描述符
文件描述符 当应用程序请求打开或者操作文件时,操作系统为应用程序设置一张文件列表,具体的实现形式此处不深入说明 操作系统会提供给你一个非负整数,作为一个索引号,它的作用就像地址或者说指针或者说偏移 ...
- python - 数据描述符(class 内置 get/set/delete方法 )
数据描述符(class 内置 get/set/del方法 ): # 什么是描述符 # 官方的定义:描述符是一种具有“捆绑行为”的对象属性.访问(获取.设置和删除)它的属性时,实际是调用特殊的方法(_g ...
- Pthon魔术方法(Magic Methods)-上下文管理
Pthon魔术方法(Magic Methods)-上下文管理 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.上下文管理方法 __enter__: 进入与此对象相关的上下文.如果 ...
- 【Python】【元编程】【二】【描述符】
""" #描述符实例是托管类的类属性:此外,托管类还有自己实例的同名属性 #20.1.1 LineItem类第三版:一个简单的描述符#栗子20-1 dulkfood_v3 ...
- python2.7高级编程 笔记二(Python中的描述符)
Python中包含了许多内建的语言特性,它们使得代码简洁且易于理解.这些特性包括列表/集合/字典推导式,属性(property).以及装饰器(decorator).对于大部分特性来说,这些" ...
- 【python】描述符descriptor
开始看官方文档,各种看不懂,只看到一句Properties, bound and unbound methods, static methods, and class methods are all ...
- Python描述符(descriptor)解密(转)
原文:http://www.geekfan.net/7862/ Python中包含了许多内建的语言特性,它们使得代码简洁且易于理解.这些特性包括列表/集合/字典推导式,属性(property).以及装 ...
随机推荐
- pytorch实现 | Deformable Convolutional Networks | CVPR | 2017
文章转载自微信公众号:[机器学习炼丹术],请支持原创. 这一篇文章,来讲解一下可变卷积的代码实现逻辑和可视化效果.全部基于python,没有C++.大部分代码来自:https://github.com ...
- 彻底理解Spring如何解决循环依赖
Spring bean生命周期 可以简化为以下5步. 1.构建BeanDefinition 2.实例化 Instantiation 3.属性赋值 Populate 4.初始化 Initializati ...
- 持久层之 MyBatis: 第二篇 :动态SQL And多表查询
MyBatis入门到精通 完整CRUD UserDaoImpl 编写UserDao对应的UserDaoMapper.xml 添加UserDao的测试用例 编写UserDao的测试用例 解决数据库字段名 ...
- Java基础进阶:时间类要点摘要,时间Date类实现格式化与解析源码实现详解,LocalDateTime时间类格式化与解析源码实现详解,Period,Duration获取时间间隔与源码实现,程序异常解析与处理方式
要点摘要 课堂笔记 日期相关 JDK7 日期类-Date 概述 表示一个时间点对象,这个时间点是以1970年1月1日为参考点; 作用 可以通过该类的对象,表示一个时间,并面向对象操作时间; 构造方法 ...
- ESP定律脱壳
ESP定律是比较常用的脱壳方式,作为新手用的也比较多简单写一下我的看法. esp定律的使用过程大致为: 1.开始就点F8,注意观察OD右上角的寄存器中ESP有没突现(变成红色),并且只有sp和ip为 ...
- Ubuntu系统的ifconfig命令不能执行
新安装的Ubuntu想要用WinSCP传文件时发现,ifconfig命令用不了 ping www.baidu.com 获得回应,应该是ifconfig未安装 解决这个问题,首先如图(时间较长,获取:[ ...
- Hive Hooks介绍
Hive作为SQL on Hadoop最稳定.应用最广泛的查询引擎被大家所熟知.但是由于基于MapReduce,查询执行速度太慢而逐步引入其他的近实时查询引擎如Presto等.值得关注的是Hive目前 ...
- easyui中设置开始日期只能选择比结束日期小的日期,js代码获取日期的值
$("#start_date").datebox({ onSelect: function (beginDate) { $('#end_date').datebox().dateb ...
- 手写简易版RPC框架基于Socket
什么是RPC框架? RPC就是远程调用过程,实现各个服务间的通信,像调用本地服务一样. RPC有什么优点? - 提高服务的拓展性,解耦.- 开发人员可以针对模块开发,互不影响.- 提升系统的可维护性及 ...
- nginx二级域名配置[CentOS]
目录 背景 域名配置 服务器配置 Nginx配置 页面访问生效 背景 只有一台云服务器,部署了自己写的后端管理系统,又需要部署下自己的个人博客平台,但是只有一个域名,想要合理的利用下二级域名. 域名配 ...