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
posted @ 2022-08-15 00:30  青山原  阅读(136)  评论(0编辑  收藏  举报