定制类

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应用中。

  

原文地址:https://www.cnblogs.com/vonkimi/p/6942440.html