getattr和methodcaller剖析

2023-10-14 13:19
文章标签 剖析 getattr methodcaller

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

这篇关于getattr和methodcaller剖析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/210746

相关文章

深度剖析AI情感陪伴类产品及典型应用 Character.ai

前段时间AI圈内C.AI的受够风波可谓是让大家都丈二摸不着头脑,连C.AI这种行业top应用都要找谋生方法了!投资人摸不着头脑,用户们更摸不着头脑。在这之前断断续续玩了一下这款产品,这次也是乘着这个风波,除了了解一下为什么这么厉害的创始人 Noam Shazeer 也要另寻他路,以及产品本身的发展阶段和情况! 什么是Character.ai? Character.ai官网:https://

最新版 | 深入剖析SpringBoot3源码——分析自动装配原理(面试常考)

文章目录 一、自动配置概念二、半自动配置(误~🙏🙏)三、源码分析1、验证DispatcherServlet的自动配置2、源码分析入口@SpringBootApplication3、@SpringBootConfiguration的@Configuration4、@EnableAutoConfiguration的@AutoConfigurationPackage和@Import5、Auto

C语言深度剖析--不定期更新的第四弹

哈哈哈哈哈哈,今天一天两更! void关键字 void关键字不能用来定义变量,原因是void本身就被编译器解释为空类型,编译器强制地不允许定义变量 定义变量的本质是:开辟空间 而void 作为空类型,理论上不应该开辟空间(针对编译器而言),即使开辟了空间,也只是作为一个占位符看待(针对Linux来说) 所以,既然无法开辟空间,也无法作为正常变量使用,既然无法使用,干脆编译器不让它编译变

Java CAS 原理剖析

在Java并发中,我们最初接触的应该就是synchronized关键字了,但是synchronized属于重量级锁,很多时候会引起性能问题,volatile也是个不错的选择,但是volatile不能保证原子性,只能在某些场合下使用。   像synchronized这种独占锁属于悲观锁,它是在假设一定会发生冲突的,那么加锁恰好有用,除此之外,还有乐观锁,乐观锁的含义就是假设没有发生冲突,那么我正

STL源码剖析之【二分查找】

ForwardIter lower_bound(ForwardIter first, ForwardIter last,const _Tp& val)算法返回一个非递减序列[first, last)中的第一个大于等于值val的位置。      ForwardIter upper_bound(ForwardIter first, ForwardIter last, const _Tp& val

深入剖析 Redis 基础及其在 Java 应用中的实战演练

引言 在现代分布式系统和高并发应用中,缓存系统是不可或缺的一环,而 Redis 作为一种高性能的内存数据存储以其丰富的数据结构和快速的读写性能,成为了众多开发者的首选。本篇博客将详细介绍 Redis 的基础知识,并通过 Java 代码演示其在实际项目中的应用。 目录 什么是 Redis?Redis 数据结构详解Redis 与其他 NoSQL 数据库的对比在 Java 中使用 Redis 使用

我店平台商业模式深度剖析

“我店”平台采用了融合线上与线下资源,并以绿色积分为激励机制的创新商业模式。此模式旨在打造一个集购物、消费及积分兑换为一体的综合性服务平台。编辑v:qawsed2466。以下是对其商业模式的深入剖析: 平台定位与背景 “我店”由上海我店科技网络有限公司创立于2021年8月,作为一个本地生活服务平台,它致力于响应国家的环保政策,并运用绿色积分来促进经济活动,帮助实体店铺吸引客流。面对实体商业

剖析Cookie的工作原理及其安全风险

Cookie的工作原理主要涉及到HTTP协议中的状态管理。HTTP协议本身是无状态的,这意味着每次请求都是独立的,服务器不会保留之前的请求信息。为了在无状态的HTTP协议上实现有状态的会话,引入了Cookie机制。 1. Cookie定义 Cookie,也称为HTTP cookie、web cookie、互联网cookie或浏览器cookie,是一种用于在用户浏览网站时识别用户并为其准备

Yarn 源码 | 分布式资源调度引擎 Yarn 内核源码剖析

曾有人调侃:HBase 没有资源什么事情也做不了,Spark 占用了资源却没有事情可做?   那 YARN了解一下? 01 YARN! 伴随着Hadoop生态的发展,不断涌现了多种多样的技术组件 Hive、HBase、Spark……它们在丰富了大数据生态体系的同时,也引发了新的问题思考。   熟悉大数据底层平台的朋友,应该都了解这些为大数据场景设计的技术组件不仅个个都是消耗资源的大户,而且它们本

HDFS要点剖析

谈到大数据,不得不提的一个名词是“HDFS”。它是一种分布式文件存储系统,其系统架构图如下图所示: 从图中可以了解到的几个关键概念 元数据(MetaData)机架(Rock)块(Block) 从图中可以了解到的两个重要组件: NameNodeDataNode 需要了解的另一个组件: SecondaryNameNode 三个重要的组件说明 NameNode 简单地说,NameNod