• 定制类


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

      

  • 相关阅读:
    python基础 列表生成式
    docker 基础
    xpath例子
    redis删除以什么开头的key
    redis 关闭持久化
    python爬虫 保存页面
    python爬虫操作cookie
    SQl函数的写法
    加料记录(大屏幕)
    ios 调试
  • 原文地址:https://www.cnblogs.com/vonkimi/p/6942440.html
Copyright © 2020-2023  润新知