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,对于字符串调用类方法,这两种方式都是可行的,自行选择使用。