定制类
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应用中。
浙公网安备 33010602011771号