定制类
class Fib(object): def __init__(self): self.a,self.b=0,1 def __iter__(self): return self def __next__(self): self.a,self.b=self.b,self.a+self.b if self.a>100: raise StopIteration() return self.a def __getitem__(self,n): if isinstance(n,int): a,b=1,1 for x in range(n): a,b=b,a+b return a if isinstance(n,slice): start=n.start stop=n.stop step=1 step=n.step a,b=1,1 R=[] K=[] for x in range(stop): if x>=start: R.append(a) a,b=b,a+b K=R[::step] return K print(Fib()[0:99:2])
上例实现了 Fib数列类,还支持迭代、切片,只要想得到,就可以利用__iter__、__getitem__等函数对类进行改造,让自定义的类也拥有列表、迭代的特性。
class Mydict(object): def __init__(self,key,value): self.dict={} self.dict[key]=value def __getitem__(self,key): return self.dict[key] def __setitem__(self,key,value): self.dict[key]=value def __delitem__(self,key): self.dict.pop(key) a=Mydict('Eng',99) a['Math']=90 print(a['Eng']) print(a['Math']) del a['Math'] print(a['Math'])
该例子实现了字典表的增、删、改、查
下面这个例子是为了简便进行动态调用而写的,利用了__getattr__函数的特性,如果我们调用的方法或者属性在类中没有定义,那么类就会调用__getattr__(self,attr)函数对此进行处理,因此假设我们需要定义某些具有共性的方法,我们不需要一个一个把方法全部都实现出来,那样就太麻烦了,我们可以直接在getattr函数中对此类方法进行处理,而将具有共性的特点作为参数传入,如下所示,REST APP中所有的方法都是按照路径组织的,因此可以将路径传导
class Chain(object): def __init__(self,path='GET '): self._path=path def __getattr__(self,path): return Chain('%s/%s'%(self._path,path)) def __str__(self): return self._path __repr__=__str__ def __call__(self,path): return Chain('%s/%s'%(self._path,path)) print(Chain().users('michael').repos)
输出为:
GET /users/michael/repos
上例即为完全动态调用,比如我要调用GET /users/michael/repos我用Chain().users('michael').repos就好了,如果下次我需要GET /users/Kimi/repos我用Chain().users('Kimi').repos即可,不需要再为Kimi专门写一个方法。而且这个代码可以适配任意动态的调用请求,只需要改变参数或者函数即可,可以非常方便地用在REST API应用中。