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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值