1.上下文管理协议
在对文件进行处理也是实例化的过程,在用with打开文件时,会直接出发open函数中的enter方法,在with函数调用结束后,会直接exit方法
根据一切皆对象,除了open类之外,自己也可以自定义类,来自定义根据enter和exit完成特定的目的
class Test: def __init__(self,name): self.name=name def __enter__(self): print('this is enter') return self#返回一个值给f def __exit__(self, exc_type, exc_val, exc_tb): print('this is exit') print(exc_type,'exctype')#在代码块内如果有一场的话,会将异常类型,异常值,追踪信息返回 print(exc_val,'val') print(exc_tb,'tb') with Test('a') as f:#此时出发enter print('start opening')#在with内执行代码 print('this is end')#with内代码执行完,执行exit代码,接着执行本段代码
2.描述符的应用
利用描述符以及描述符的优先级,来给用户输入的值进行类型检测#传入的值必须是字符串,否则报错
2.1 错误示范
class Fun: def __init__(self,name,age,gender):#name为字符串,age为数字,gender为字符串 self.name=name self.age=age self.gender=gender def show(self): print(self.name,self.age,self.gender) p1=Fun('100','yehaibin','male') p1.show()#并不能对输入的类型进行限制 #其他解决方法:直接str或者int
2.2使用描述符来进行自定义
#利用描述符以及描述符的优先级,来给用户输入的值进行类型检测#传入的值必须是字符串,否则报错 #实例化的时候,如果错了,在调用时提醒 #对值进行设置的时候,如果错了,则提醒,get和set class Name_Str: def __init__(self,key): self.key=key def __get__(self, instance, owner):#instance是传来的实例, # print(instance) return instance.__dict__[self.key] def __set__(self, instance, value): if isinstance(value,str): # type(self.key) == str: instance.__dict__[self.key] = value else: print('your input %s is wrong,please input an str' %self.key) def __delete__(self, instance): pass class Age_Int: def __init__(self,key):#key为‘’age self.key=key def __get__(self, instance, owner):#instance是传来的实例, # print(instance) return instance.__dict__[self.key] def __set__(self, instance, value): if isinstance(value,int): # type(self.key) == str: instance.__dict__[self.key] = value else: print('your input %s is wrong,please input an int' %self.key) def __delete__(self, instance): pass class Fun:#直接在设置属性的时候,进行查看 name=Name_Str('name') age=Age_Int('age') gender=Name_Str('gender') def __init__(self,name,age,gender):#name为字符串,age为数字,gender为字符串 self.name=name self.age=age self.gender=gender def show(self): print(self.name,self.age,self.gender) p1=Fun('100',555,'100') # print(p1.name)#因为数据描述符的属性比实例属性的级别高,所以直接调用数据描述符get # p1.name='500' # print(p1.name) # p1.gender='500' # print(p1.gender) p1.age=11#出发set,p1为instance,11为value print(p1.age)