类的使用本质是调用类的内置方法
__getitem__, __setitem__,__delitem__,__delattr__
# __getitem__, __setitem__,__delitem__,__delattr__# 对象的属性进行获取、修改、删除时候触发的内置方法class Foo: def __init__(self,name): self.name=name def __getitem__(self, item): print(self.__dict__[item]) def __setitem__(self, key, value): self.__dict__[key]=value def __delitem__(self, key): print('del obj[key]时,我执行') self.__dict__.pop(key) def __delattr__(self, item): print('del obj.key时,我执行') self.__dict__.pop(item)f=Foo("adamander")print(f.name)print(f['name'])f['age']=18f['age1']=19print(f['age'])print(f.age1)del f.age1del f['age']print(f.__dict__)
# 内置方法:__slots__
#使用类.xxx,或者对象.xxx,来访问属性本质就是在访问类或者对象的__dict__属性字典(类的字典是共享的,而每个实例的字典是独立的)#字典会占用大量的内存,如果有一个属性很少的类,但是实例很多的类,用__slots__来代替__dict__,限制对象属性数量,# 对所有对象属性统一管理,#节省内存.缺点是不能再给实例添加新属性,只能用里面有的。class People: __slots__ = ['x','y','z']p=People()p.x=10p.y=20p.z=30print(p.x,p.y,p.z)
#实现迭代器协议的内置方法:__iter__,__next__
#实现迭代器协议的内置方法:__iter__,__next__from collections import Iterable,Iteratorclass Foo: def __init__(self,start): self.start=start def __iter__(self): return self def __next__(self): n=self.start self.start+=1 return nf=Foo(0)print(next(f))print(next(f))print(next(f))print(next(f))print(next(f))print(next(f))print(next(f))print(next(f))print(next(f))print(next(f))#一直不停的往下加# for i in f:# print(i)print("************************")
# 实现range类,__next__进行StopIteration处理
# 实现range类,__next__进行StopIteration处理class Range: def __init__(self,start,end): self.start=start self.end=end def __iter__(self): return self def __next__(self): if self.start==self.end: raise StopIteration n=self.start self.start+=1 return nfor i in Range(3, 8): print(i)# r=Range(3,11)# print(next(r))# print(next(r))# print(next(r))# print(next(r))# print(next(r))# print(next(r))# print(next(r))# print(next(r))# print(next(r))# print(next(r))# print(next(r))# print(next(r))
析构方法___del__
# 析构方法___del__析构方法,当对象在内存中被释放时,自动触发执行。# 注:此方法一般无须定义,因为Python是一门高级语言,程序员在使用时无需关心内存的分配和释放,# 因为此工作都是交给Python解释器来执行,所以,析构函数的调用是由解释器在进行垃圾回收时自动触发执行的。#垃圾回收机制,del 立即删除,不然等其他执行完毕,自动回收import timeclass Open: def __init__(self,filename,mode='r',encoding='utf-8'): self.file=open(filename,mode,encoding=encoding) def __enter__(self): print("enter=====>") return self def write(self,line): t=time.strftime('%Y-%m-%d %T') self.file.write('%s %s' %(t,line)) def __getattr__(self, item): return getattr(self.file,item) def __del__(self): print("===>del") def __exit__(self, exc_type, exc_val, exc_tb): # print("exit") # print("exc_type",exc_type) # print("exc_val",exc_val) # print("exc_tb",exc_tb) self.file.close()with Open('b.txt','w+') as f: f.write("xxxx") f.write("xxxx") f.write("xxxx")
# __call__实例调用
# __call__实例调用# __call__实例调用,没有他,实例是不可调用的class People: def __init__(self,name): self.name=name # def __call__(self, *args, **kwargs): # passp=People("ada")print(callable(People))#Trueprint(callable(p))#False,然而放开注释就是True