上下文管理方法:

可以在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-上下文管理方法,描述符的应用,错误与异常的更多相关文章

  1. NDK开发之获得域和方法描述符

    在NDK开发之调用方法和NDK开发之访问域两篇博客中,我们在获得域ID和方法ID时都需要一个叫做描述符的参数,那么在实际开发中我们怎么知道我们要调用的域或者方法的描述符呢? 一个简单的方法就是使用Ja ...

  2. 进程管理—进程描述符(task_struct)

    http://blog.csdn.net/qq_26768741/article/details/54348586 当把一个程序加载到内存当中,此时,这个时候就有了进程,关于进程,有一个相关的叫做进程 ...

  3. [一]FileDescriptor文件描述符 标准输入输出错误 文件描述符

    文件描述符   当应用程序请求打开或者操作文件时,操作系统为应用程序设置一张文件列表,具体的实现形式此处不深入说明 操作系统会提供给你一个非负整数,作为一个索引号,它的作用就像地址或者说指针或者说偏移 ...

  4. python - 数据描述符(class 内置 get/set/delete方法 )

    数据描述符(class 内置 get/set/del方法 ): # 什么是描述符 # 官方的定义:描述符是一种具有“捆绑行为”的对象属性.访问(获取.设置和删除)它的属性时,实际是调用特殊的方法(_g ...

  5. Pthon魔术方法(Magic Methods)-上下文管理

    Pthon魔术方法(Magic Methods)-上下文管理 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.上下文管理方法 __enter__: 进入与此对象相关的上下文.如果 ...

  6. 【Python】【元编程】【二】【描述符】

    """ #描述符实例是托管类的类属性:此外,托管类还有自己实例的同名属性 #20.1.1 LineItem类第三版:一个简单的描述符#栗子20-1 dulkfood_v3 ...

  7. python2.7高级编程 笔记二(Python中的描述符)

    Python中包含了许多内建的语言特性,它们使得代码简洁且易于理解.这些特性包括列表/集合/字典推导式,属性(property).以及装饰器(decorator).对于大部分特性来说,这些" ...

  8. 【python】描述符descriptor

    开始看官方文档,各种看不懂,只看到一句Properties, bound and unbound methods, static methods, and class methods are all ...

  9. Python描述符(descriptor)解密(转)

    原文:http://www.geekfan.net/7862/ Python中包含了许多内建的语言特性,它们使得代码简洁且易于理解.这些特性包括列表/集合/字典推导式,属性(property).以及装 ...

随机推荐

  1. angular8 大地老师学习笔记---第九课

    父组件:news组件 <app-header [title]="title" [msg]="msg" [run]='run' [home]='this'& ...

  2. Python 学习笔记(上)

    Python 学习笔记(上) 这份笔记是我在系统地学习python时记录的,它不能算是一份完整的参考,但里面大都是我觉得比较重要的地方. 目录 Python 学习笔记(上) 基础知识 基本输入输出 模 ...

  3. 【Tomcat】Tomcat原理与系统架构

    目录 版本: 一,目录说明 二,浏览器访问服务器的流程 三,Tomcat系统总体架构 3.1 Tomcat请求的大致流程 3.2 Servlet容器处理请求流程 3.3 Tomcat系统总体架构 四, ...

  4. 同一个UITextField 根据不同状态下弹出不同类型键盘遇到的坑

    一,需求:有多个选项按钮,点击不同的按钮,textfield内容需求不同弹出对应需求的键盘类型. 二,问题:1.刚开始在按钮状态改变后设置 self.textField.keyboardType属性完 ...

  5. C# 7-zip 压缩和解压缩

    using System; using System.Collections.Generic; using System.Text; using SevenZip; using System.IO; ...

  6. WIN7远程桌面连接提示:“发生身份验证错误。要求的函数不受支持”

    问题 WIN7远程桌面连接–"发生身份验证错误.要求的函数不受支持" 最近WIN7升级补丁后发现远程桌面无法连接了,报"发生身份验证错误.要求的函数不受支持"的 ...

  7. Python文件部分(不包括数据)

    一,基本操作过程:1.a = open(文件名 ,打开方式) 2.a.read(size) | a.readline(size) | a.readlines(hint) 或 a.write(s) | ...

  8. 重入锁ReentrantLock

  9. 我是这样理解EventLoop的

    我是这样理解EventLoop的 一.前言   众所周知,在使用javascript时,经常需要考虑程序中存在异步的情况,如果对异步考虑不周,很容易在开发中出现技术错误和业务错误.作为一名合格的jav ...

  10. 一文彻底吃透MyBatis源码!!

    写在前面 随着互联网的发展,越来越多的公司摒弃了Hibernate,而选择拥抱了MyBatis.而且,很多大厂在面试的时候喜欢问MyBatis底层的原理和源码实现.总之,MyBatis几乎成为了Jav ...