上下文管理协议
class Feng_Open: def __init__(self,name): self.name = name def __enter__(self): print('执行enter') return self def __exit__(self, exc_type, exc_val, exc_tb): print('执行exit') #异常 print(exc_type,exc_val,exc_tb) return Truewith Feng_Open('a.txt') as f: print(f) print(1/0) print('+++++++++++++') print('+++++++++++++') print('+++++++++++++')print('ffffffffffffffffffff')复制代码
描述符应用
class Typed: def __init__(self,key,expected_type): self.key = key self.expected_type = expected_type def __get__(self, instance, owner): print('get方法--%s--%s' %(instance,owner)) return instance.__dict__[self.key] def __set__(self, instance, value): print('set方法-%s---%s'%(instance,value)) if not isinstance(value,self.expected_type): # print('你传入的类型不是字符串,请修改错误') # return raise TypeError('%s传入的类型不是%s'%(self.key,self.expected_type)) instance.__dict__[self.key]=value def __delete__(self, instance): print('delete') instance.__dict__.pop(self.key)#name属性被数据描述符代理class People: name = Typed('name',str) age = Typed('age',int) def __init__(self,name,age,salary): self.name = name self.age = age self.salary = salaryp1 = People('fengfeng',18,100)#类属性>数据描述符>实例属性>费数据描述符>不存在p1.name = 'xiaorong'print(p1.name)print(p1.__dict__)del p1.nameprint(p1.__dict__)# xiaoming# {'name': 'xiaoming', 'age': 18, 'salary': 100}# delete# {'age': 18, 'salary': 100}复制代码
类的装饰器
# def method1(obj):# print('------------')# #进行操作# obj.name='feng'# return obj# # @method1# # def test():# # print('test')# # test()# @method1# class Feng:# pass# print(Feng.__dict__)def Typed(**kwargs): def deco(obj): for key,val in kwargs.items(): setattr(obj,key,val) return obj return deco@Typed(name='fengfeng')class Feng: passprint(Feng.__dict__)复制代码