上下文管理方法:

可以在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. 为什么放弃Hibernate、JPA、Mybatis,最终选择JDBCTemplate

    一.前言 因为项目需要选择数据持久化框架,看了一下主要几个流行的和不流行的框架,对于复杂业务系统,最终的结论是,JOOQ是总体上最好的,可惜不是完全免费,最终选择JDBC Template. Hibe ...

  2. asp.net webapi 给字段赋初始值DefaultValue 解决前端传空字符串后台接受不是“”而是NULL

    /// <summary> /// 存储ID /// </summary> public Guid SaveID { get; set; } /// <summary&g ...

  3. (八)、rm--删除文件或者目录

    一.命令的描述与格式 永久地删除文件或者目录,此命令具有破坏性,一旦删除,没有备份,无法恢复 格式:rm  [选项]  文件或者目录 -d或者--directory                  ...

  4. springboot(一)入门篇

    作者:纯洁的微笑 出处:www.ityouknow.com 版权所有,欢迎保留原文链接进行转载:) 根据原文以下内容略有调整(由于SpringBoot版本更新引起) 什么是spring boot Sp ...

  5. TurtleBot3 Waffle (tx2版华夫)(5)激活你的雷达

    重要提示:请在配网通信成功后进行操作,配网后再次开机需要重新验证通信: 重要提示:[Remote PC]代表PC端.[TurtelBot]代表树莓派端: 5.1.操作步骤 1)[Remote PC]  ...

  6. Android中app开机自启动的开发

    (1)首先添加权限开机启动权限 <!--开机启动权限--> <uses-permission android:name="android.permission.RECEIV ...

  7. introJs用法及在webkit内核浏览器的一个报错

    1.用法 很简单的用法,引入js,引入css,再执行introJs().start();就可以了(备注:introJs会自动去抓取含有data-intro的dom在introJs源码中_introFo ...

  8. Java并发包源码学习系列:AQS共享式与独占式获取与释放资源的区别

    目录 Java并发包源码学习系列:AQS共享模式获取与释放资源 独占式获取资源 void acquire(int arg) boolean acquireQueued(Node, int) 独占式释放 ...

  9. 项目实战--解决运行sql文件错误

    说明: 新项目启动,通过公司运维同学给的数据库脚本在Navicat中建项目的数据库,运行脚本时报错 Error Code: 1227. Access denied; you need (at leas ...

  10. chatsRoom Design Report

    基于TCP实现聊天室 主要使用四个类 ChatClient类     使用BufferedReader 得到输入流,使用OutputStream得到输出流     实现读取服务器广播的消息和发送消息到 ...