面向对象的高阶用法
class Foo: def __init__(self,name,age): self.name=name self.age=age def __str__(self): #必须有返回值,且必须返回字符串类型 return '<name:%s age:%s>' %(self.name,self.age) obj=Foo('bao',12) print(obj)
del
class Foo: def __init__(self,name,age): self.name=name self.age=age def __del__(self):#析构方法 print("del---->") #程序运行结束后,内存释放,会执行del方法。 obj=Foo('bao',12) print("========>>") #先执行print。在执行del
下面这三个以后用于 接口。
class Foo: def __init__(self,name): self.name=name def __getitem__(self, item): print("getitem") return self.__dict__[item] def __setitem__(self, key, value): #修改 print("setitem",key,value) self.__dict__[key]=value def __delitem__(self, key): #删除 print('del obj[key]时,我执行') self.__dict__.pop(key) obj=Foo('egon') # obj.name='bao66' # print(obj.name) obj['name'] = 'bao66' # print(obj.name) del obj['name'] print(obj.__dict__)
#加上item方法,则无需判断obj的类型,不管是dict类型还是Foo类型,都以统一的一种[]的方式操作 def func(obj,key,value): obj[key]=value #obj['name']='123123' dic={'name':'egon','age':18} obj=Foo('egon') print(obj.__dict__)
attr系列
class Foo: def __init__(self,x): self.x=x #初始化 def __getattr__(self, item): #属性没有的时候触发getattr print("getattr") def __setattr__(self, key, value): #设置的时候触发 # print("setattr") self.__dict__[key]=value #实例化 否则print打印为空 def __delattr__(self, item): #执行del的时候触发delattr print("delattr") self.__dict__.pop(item) obj=Foo(10) obj.x=1 obj.c=2 obj.d=3 print(obj.__dict__) del obj.c print(obj.__dict__) 结果 {'c': 2, 'x': 1, 'd': 3} delattr {'x': 1, 'd': 3}
二次加工
class List(list): """ 功能描述 第一字列表的添加append,第二取中间数//2,第三清空list """ def __init__(self,item,tag=False): super().__init__(item) self.tag=tag def append(self, p_object): if not isinstance(p_object,str): raise TypeError('%s must be str' %p_object) super(List,self).append(p_object) @property def mid(self): mid_index=len(self)//2 return mid_index def clear(self): if not self.tag: raise PermissionError('not permissive') super().clear() self.tag=False bao = List([1,2,3,4,5]) print(bao) bao.append('6') print(bao) print(bao.mid)
授权 重写open
import time class Open: def __init__(self,filepath,mode='r',encoding='utf-8'): self.filepath=filepath self.mode=mode self.encoding=encoding self.f = open(self.filepath,mode=self.mode,encoding=self.encoding) def write(self,msg): t=time.strftime('%Y-%m-%d %X') self.f.write('%s %s\n' %(t,msg)) def __getattr__(self,item): return getattr(self.f,item) obj=Open('a.txt','w+',encoding='utf-8') obj.write('111111111\n') obj.write('22222222\n') obj.write('333333333333\n') obj.seek(0) # print(obj.read()) #self.f.read() obj.close() #self.f.close()
上下文管理协议
class Open: def __init__(self, name,mode='r',encoding='utf-8'): self.name = name self.mode=mode self.encoding=encoding self.f=open(self.name,mode=self.mode,encoding=self.encoding) def __enter__(self): # print('__enter__') return self.f def __exit__(self, exc_type, exc_val, exc_tb): # print('__exit__') print(exc_type) print(exc_val) print(exc_tb) self.f.close() return True # obj=Open('b.txt','w') # print(obj) with Open('c.txt','w') as f: #f=self.f print(f) 1/0 print('===>') f.write('11111\n') f.write('22222\n') print('=======>with以外的代码')

浙公网安备 33010602011771号