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).以及装 ...
随机推荐
- sqli-labs 18-19 --Header_injection
sqli-labs 18 知识点 头部注入 报错注入 使用的函数: updatexml (XML_document, XPath_string, new_value); 第一个参数:XML_docum ...
- BERT 论文阅读笔记
BERT 论文阅读 BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding 由 @快刀切草莓君 ...
- 使用Canvas绘制分享海报
这几天接到一个需求,需要将一个邀请链接转换为一个带有二维码并且能够分享出去的海报图,网上找了很多的方法,也踩了不少的坑,希望大家遇到类似的需求能够少走弯路.. 具体效果图如下: 效果图 首先我采用了 ...
- Python爬取热搜存入数据库并且还能定时发送邮件!!!
一.前言 微博热搜榜每天都会更新一些新鲜事,但是自己处于各种原因,肯定不能时刻关注着微博,为了与时代接轨,接受最新资讯,就寻思着用Python写个定时爬取微博热搜的并且发送QQ邮件的程序,这样每天可以 ...
- 手写系列:call、apply、bind、函数柯里化
少废话,show my code call 原理都在注释里了 // 不覆盖原生call方法,起个别名叫myCall,接收this上下文context和参数params Function.prototy ...
- Linux 时间同步 05 chrony时间同步
Linux 时间同步 05 chrony时间同步 目录 Linux 时间同步 05 chrony时间同步 chrony 的优势: chrony包介绍 安装chrony 配置与外部时间服务器进行时间同步 ...
- HTML学习案例-仿慕课网网页制作(一)
概述:仿制慕课网头部导航栏和分支导航栏的外观 考察知识点: 1.消除浮动的原因:如果最上面的块级元素不清楚浮动的话就会影响下面的块级元素的布局 对subnav块使用了float,结果subnav块飞到 ...
- linux的 复制 删除 解压 压缩 打包
liunx 删除 删除文件夹实例: rm -rf /var/log/httpd/access 将会删除/var/log/httpd/access目录以及其下所有文件.文件夹 2 删除文件使用实例: r ...
- 并发编程--锁--Lock和Synchronized
说说对于 synchronized 关键字的了解? synchronized关键字解决的是多个线程之间访问资源的同步性: synchronized 关键字可以保证被它修饰的方法或者代码块在任意时刻只能 ...
- 在.NET Core中使用Channel(三)
到目前为止,我们一直在使用所谓的"Unbounded"通道.你会注意到,当我们创建通道时,我们这样做: var myChannel = Channel.CreateUnbounde ...