1,item系列
把对象操作熟悉模拟成字典的格式
class Foo: def __init__(self,name): self.name=name def __getitem__(self, item): return self.__dict__[item] def __setitem__(self, key, value): self.__dict__[key]=value def __delitem__(self, key): self.__dict__.pop(key) f=Foo('feng') print(f['name'])
2,Python上下文管理器以及with语句
上下文管理器要实现__enter__和__exit__的特殊方法。
__enter__(self): 进入上下文管理器时调用此方法,其返回值将被放入with-as语句中as说明符指定的变量中。
__exit__(self,type,value,tb):离开上下文管理器调用此方法。如果有异常出现,type、value、tb分别为异常的类型、值和追踪信息。如果没有异常,
3个参数均设为None。此方法返回值为True或者False,分别指示被引发的异常得到了还是没有得到处理。如果返回False,引发的异常会被传递出上下文。
文件上下文管理协议大概是如下实现的:
class OpenFile(object): def __init__(self,filename,mode): self.filename=filename self.mode=mode def __enter__(self): self.f=open(self.filename,self.mode) return self.f #作为as说明符指定的变量的值 def __exit__(self,type,value,tb): self.f.close() return False #异常会被传递出上下文 with OpenFile('my_file.txt','w') as f: f.write('Hello ') f.write('World')
相当于:
try : 执行__enter__的内容 finally: 执行__exit__的内容
3,通过__iter__,__next__实现迭代器协议
class c1:
def __init__(self,start):
self.start = start
def __iter__(self):
return self
def next(self):
self.start += 1
return self.start
o1 = c1(10)
for i in o1:
print i
4,构析函数
import time class Open: def __init__(self,filepath,mode='r',encode='utf-8'): self.f=open(filepath,mode=mode,encoding=encode) def write(selfself): pass def __getattr__(self, item): return getattr(self.f,item) def __del__(self): print('del') self.f.close() f=Open('a.txt','w') del f
上图中的“__del__”就是一个析构函数了,当使用del 删除对象时,会调用他本身的析构函数,另外当对象在某个作用域中调用完毕,在跳出其作用域的同时析构函数也会被调用一次,这样可以用来释放内存空间。
__del__()也是可选的,如果不提供,则Python 会在后台提供默认析构函数
如果要显式的调用析构函数,可以使用del关键字,方式如下:
del对象名
6,__slots__方法
class People: __slots__=['x','y','z'] p=People() print(People.__dict__) p.x=1 p.y=2 p.z=3 print(p.x,p.y,p.z) p1=People() p1.x=10 p1.y=20 p1.z=20 print(p1.x,p1.y,p1.z) # print(p1.__dict__)
7,元类
type成为元素,是所有类的类 ,利用type模拟class关键字的创建类的过程
def run(self): print('%s is runing'%self.name) class_name='Bar' bases=(object,) class_dic={'x':1, 'run':run} Bar=type(class_name,bases,class_dic) print(Bar) print(type(Bar))