Python 内置函数getattr()


优点

  • 可消除if…else

 

Python 面向对象中的反射

  • 通过字符串的形式操作对象的属性,true or false
  • Python 中一切皆为对象,所以只要是对象都可以使用反射
  • 比如:实例对象、类对象、本模块、其他模块,因为他们都能通过 对a.属性 的方式获取、调用

 

hasattr
def hasattr(*args, **kwargs): 
    pass
  • 返回对象是否具有具有给定名称的属性

 

getattr
def getattr(object, name, default=None): 
    pass
  • 获取对象指定名称的属性
  • 当属性不存在,则返回 default 值,如果没有指定 default 就会抛出异常

 

未使用反射前

class BaseRequest:
    req = requests.Session()

    def get(self, url):
        resp = self.req.get(url)
        print("==get==")
        return resp

    def post(self, url):
        resp = self.req.post(url)
        print("==post==")
        return resp

    def put(self, url):
        resp = self.req.put(url)
        print("==put==")
        return resp

    # 不使用反射的方法
    def main(self, method, url):
        if method == "get":
            self.get(url)
        elif method == "post":
            self.post(url)
        elif method == "put":
            self.put(url)

 

使用反射后

    # 使用反射的方法
    def main_attr(self, method, url):
        if hasattr(self, method):
            func = getattr(self, method)
            func(url)

 

实际运用

# 原始 
def get(self, url, **kwargs):
    '''
    定义get方法
    '''
    response = requests.get(self.host + url, **kwargs, timeout=self.timeout, verify=False)
    return response

def post(self, url, **kwargs):
    '''
    定义post方法
    '''
    response = requests.post(self.host + url, **kwargs, timeout=self.timeout, verify=False)
    return response

# 优化
def main_http(self, method, url, **kwargs):
    # 判断对象是否有对应的方法
    if hasattr(self, method):
        # 获取对应的方法
        func = getattr(self, method)
        # 执行方法,且获取返回值
        res = func(url, **kwargs)
        return res

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/280602.html

(0)
上一篇 2022年8月15日
下一篇 2022年8月15日

相关推荐

发表回复

登录后才能评论