python自带的三个装饰器,内建函数getattr工厂模式

2019-11-27 23:29栏目:专项工作
TAG:

getattr()这个方法最主要的作用是实现反射机制。也就是说可以通过字符串获取方法实例。  传入不同的字符串,调用的方法不一样。

在做接口自动化测试的时候,总会遇到,因连接超时等错误导致,接口脚本失败。

说到装饰器,就不得不说python自带的三个装饰器:

原型:getattr(对象,方法名)

官方给出的方法:

1、@property   将某函数,做为属性使用

 

max_retries=5 出错重试5次
注意的是,这个只对DNS,连接错误进行重试。

    from requests.adapters import HTTPAdapter
    s = requests.Session()
    s.mount('http://',HTTPAdapter(max_retries=5))
    s.mount('https://',HTTPAdapter(max_retries=5))
    s.get('https://www.baidu.com')

 @property 修饰,就是将方法,变成一个属性来使用。

举个栗子:

 

class A():


    @property
    def pfunc(self):
        return self.value

    @pfunc.setter
    def pfunc(self,value):
        self.value = value

    @property
    def pfunc1(self):
        print('this is property')

if __name__=="__main__":

    A.pfunc = 9
    print A.pfunc
    A.pfunc1

pyMethod类下定义了三个方法,getattr(pyMethod(),'out%s'%str)()   传入的方法名不同,调用不同的方法。些处方法名为字符串。

 

 

这样的话,想想是不是用途很多,我可以把方法名配置到文件中,读取时使用getattr动态去调用。

自编写装饰器一

2、@classmethod  修饰类的方式

#coding=utf-8

class pyMethod(object):
    def outstr(self):
        print('this is string')

    def outint(self):
        print('this is number')

    def outdate(self):
        print('this is date')


if __name__=="__main__":
    str = 'int'
    getattr(pyMethod(),'out%s'%str)()     
    str = 'str'
    getattr(pyMethod(),'out%s'%str)()
    str = 'date'
    getattr(pyMethod(),'out%s'%str)()
from requests.exceptions import ConnectionError
import requests
def retry(**kw):
    def war(func):
        def w(*args,**kwargs):
            try:
                ret = func(*args,**kwargs)
            except ConnectionError:
                kw['reNum'] = int(kw['reNum']) - 1
                if kw['reNum'] >=0:
                    print kw['reNum']
                    ret = w(*args,**kwargs)
                else:
                    ret = ConnectionError
            return ret
        return w
    return war

带修饰类方法:cls做为方法的第一个参数,隐式的将类做为对象,传递给方法,调用时无须实例化。

 

 

普通函数方法:self做为第一个参数,隐式的将类实例传递给方法,调用方法时,类必须实例化。

 getattr(pyMethod(),'out%s'%str)()  注意pyMethod()和最后的()   这里之所以这么写pyMethod()加括号是实例化类对象,最后的括号,因为getattr函数反射后,是一个方法对象。

自编写装饰器二

class A():
    def func(self,x,y):
        return x * y

    @classmethod
    def cfunc(cls,x,y):
        return x * y

if __name__=="__main__":
    print A().func(5,5)
    print A.cfunc(4,5)

版权声明:本文由ag真人发布于专项工作,转载请注明出处:python自带的三个装饰器,内建函数getattr工厂模式