getattr和methodcaller剖析

getattr解析

一、getattr是什么?

getattr() 函数获取某个类实例对象中指定属性的值

二、语法格式

getattr(obj, name[, default])
  • obj 表示指定的类实例对象
  • name 表示指定的属性名
  • default 是可选参数,用于设定该函数的默认返回值
    • 即当函数查找失败时,如果不指定 default 参数,则程序将直接报 AttributeError 错误
    • 反之该函数将返回 default 指定的值。

三、使用

1.构造一个类方法

class KeyWord(object):
    driver = "chrome驱动"
    def openBrowser(self, browser):
        print(f"openBrowser is running {browser}")

2.调用存在的类属性

kw = Keywork()
driver = getattr(kw, "driver")
print(driver)
# ----------------------
chrome驱动

3.调用不存在的类属性(会报错)

name = getattr(kw, "name")
print(name)
# -------------------
AttributeError: 'Keywork' object has no attribute 'name'

4.调用不存在的类属性(设置默认值)

name = getattr(kw, "name","Desire")
print(name)
# -------------------
Desire

5.调用类方法

openBrowser = getattr(kw, "openBrowser") # 获取类方法
openBrowser(browser="Chrome") # 调用类方法

methodcaller解刨

一、methodcaller 是什么?

Python内部提供的一个可以通过字符串调用类方法的一个包,在operator库中。

二、使用

1.导包

from operator import methodcaller

2.使用字符串"openBrowser"执行对应的openBrowser类方法

method = methodcaller("openBrowser", browser="Chrome")
keyword = KeyWord()
method(keyword)

3.执行结果

# --------------------------------
openBrowser is running Chrome

三、解刨

1. 源码

def methodcaller(name, /, *args, **kwargs):
    def caller(obj):
        return getattr(obj, name)(*args, **kwargs)
    return caller

2.解读

  • 采用了闭包的形式
  • 调用methodcaller函数时,返回的是methodcaller内部的函数
    • 也就是说调用后返回的还是一个函数
    • 调用methodcaller函数的返回值(method),其实就是caller(obj)
  • method == caller,所以我们可以通过method(obj)执行methodcaller内部方法caller中的函数体了
  • caller函数操作:通过getattr() 函数从指定的对象返回指定属性的值,从而实现了通过字符串调用类方法

比对总结

从上面的methodcaller源码和解读中可以看到,methodcaller底层还是使用的getattr,对于字符串调用类方法,这两种方式都是可行的,自行选择使用。

上一篇:day07_07 反射


下一篇:【附下载包】通过鸿蒙自定义属性,来创造一个可以为所欲为的自定义标题组件