Python中getattr()调用属性与直接调用对象属性的区别是什么?
两段deque操作代码的运行逻辑差异
第一段代码(可正常达到预期)
通过Python的getattr内置函数实现动态方法调用,逻辑完全符合预设需求:
- 输入拆分后得到的
method是字符串类型,存储的是用户输入的deque方法名(比如append、popleft等) getattr(d, method)会根据字符串的实际内容,去deque实例d中获取同名的方法对象- 后续
(*n)会把输入拆分得到的参数解包传入方法调用,实现对deque的动态操作
第二段代码(无法正常运行,结果必然不一致)
d.method(*n)是固定属性访问语法,和你定义的method变量没有任何关联:
- 这里的
method是代码写死的属性名,Python不会读取method变量的值,只会直接去d中查找名字就叫method的方法 - deque类本身没有定义过
method这个方法,运行到这一行会直接抛出AttributeError报错,无法完成后续的任何deque操作
举个实际场景示例:假设输入内容为
append 3,第一段代码等价于执行d.append("3");第二段代码等价于执行d.method("3"),直接触发属性不存在的错误。
核心本质差异:getattr是根据变量的值动态获取属性,点号访问语法是直接访问和后面字面量同名的属性,和同名变量完全无关
内容的提问来源于stack exchange,提问作者Abinash Karki
相关产品推荐
相关产品推荐

