Python 对象上下文管理协议
class MyOpen: def __init__(self,filename): self.filename=filename def __enter__(self): self.file = open(self.filename, 'r') data = self.file.read() print(data) """ 如果 with代码块里面的程序没有异常,则执行with代码块里面的程序后,触发__exit__, 它后面的三个参数都为None; 如果 with代码块里面的程序发生异常, 则在发生异常的位置 触发触发__exit__,它后面的三个参数都不为None,分别代表着三个异常信息 如果返回True,则代表吞掉异常,with代码块外面的程序继续执行 如果返回False,或不返回任何信息,则抛出异常 """ def __exit__(self, exc_type, exc_val, exc_tb): self.file.close() print('__exit__') return True with MyOpen('config.txt') as f: print(6/0) print(666)
利用描述符来限定对象属性的类型
class Typed: def __init__(self,key,type): self.key=key self.type=type def __get__(self, instance, owner): print('__get__') return instance.__dict__[self.key] def __set__(self, instance, value): print('__set__') if type(value) is self.type: instance.__dict__[self.key]=value else: raise TypeError('属性【%s】的类型必须是%s'%(self.key,self.type)) def __delete__(self, instance): print('__delete__') del instance.__dict__[self.key] class People: name=Typed('name',str) age=Typed('age',int) salary=Typed('salary',float) def __init__(self,name,age,salary): self.name=name self.age=age self.salary=salary p=People('jack',23,1234) print(p.name)