上下文管理方法:

可以在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. Abp vNext异常处理的缺陷/改造方案

    吐槽Abp Vnext异常处理! 哎呀,是一个喷子 目前项目使用Abp VNext开发,免不了要全局处理异常.提示服务器异常信息. 1. Abp官方异常处理 Abp项目默认会启动内置的异常处理,默认不 ...

  2. 转载:从输入 URL 到页面加载完的过程中都发生了什么事情?

    原帖地址:http://www.guokr.com/question/554991/ 1)把URL分割成几个部分:协议.网络地址.资源路径.其中网络地址指示该连接网络上哪一台计算机,可以是域名或者IP ...

  3. Office__自动保存和恢复

    #1.前言 在您埋头辛苦编辑Excel.Word或PPT文档的时候,如果突然发生断电.系统崩溃.意外误操作,本文将以Excel2010为例详细阐述其中自动保存功能的工作机理和恢复文件的访问方法,Exc ...

  4. root密码忘记了,怎么办?

    root是管理员使用的超级用户,如果密码忘记了,可以使用以下两种方法修改. 方法一: 进入单用户模式下进行密码修改 步骤1:重启系统,在系统进入3秒启动阶段,快速点击键盘上任意键可以取消默认进入系统状 ...

  5. Spring Boot 中使用 Quartz 实现任务调度

    Quartz 概述 Quartz 是 OpenSymphony 开源组织在 Job Scheduling 领域又一个开源项目,它可以与 J2EE. J2SE 应用程序相结合也可以单独使用.Quartz ...

  6. iOS崩溃治理--开篇

    去年我开始负责iOS崩溃治理的工作,从原来的万分之五崩溃率,一直到现在的万分之一左右的崩溃率,期间踩了很多坑,因此想和大家分享一下,希望能对大家有所帮助,也欢迎大家私信交流. 如果你打算开始治理崩溃的 ...

  7. setTimeout 是到了xx ms 就执行吗,了解浏览器的 Event-Loop 机制

    要想 JavaScript 玩得溜,还得了解波 JavaScript 执行机制/(ㄒoㄒ)/~~. 个人博客:https://shansan.top 前言 最近看了波 JavaScript 相关的文章 ...

  8. 利用MD5进行加密

    package com.cn.peitest; import java.io.UnsupportedEncodingException; import java.security.MessageDig ...

  9. Qt学习笔记-Qtcreator的webkit和qt4.7.0的版本有关

    之前下载了一个最新的是qtcreator,是通过ubuntu的是apt-get下载的.可是里面没有webkit控件.网上的网友说是最新的没有了.要用老版的,于是下载了一个2.5.2的就正常了. 用老版 ...

  10. python实现AES/DES/RSA/MD5/SM2/SM4/3DES加密算法模板汇总

    都是作者累积的,且看其珍惜,大家可以尽量可以保存一下,如果转载请写好出处https://www.cnblogs.com/pythonywy 一.md5加密 1.简介 这是一种使用非常广泛的加密方式,不 ...