getattr仅按名取值,返回值类型决定后续行为:普通数据不可调用,绑定方法可直接调用,property返回计算值而非方法对象;应通过callable()或inspect模块判断可调用性,而非依赖getattr本身。

getattr 本身不区分属性访问还是方法调用,它只负责按名字取值——取出来是什么类型,就按什么类型处理。
getattr 返回值决定后续行为
getattr(obj, "name") 返回的可能是:
- 普通数据(如 int、str):直接使用值,不可调用
- 绑定方法(bound method):返回的是已绑定到 obj 的可调用对象,后面加 () 就能执行
- 未绑定函数(如通过类名调用 getattr(MyClass, "func")):需手动传入实例作为第一个参数
- property 或其他描述符:返回其 __get__ 方法的计算结果,表现像普通属性
如何判断返回值是属性还是方法
不能靠 getattr 判断,而要检查返回值本身:
- 用 callable() 检查是否可调用:如果
callable(getattr(obj, "x"))为 True,大概率是方法、函数或实现了 __call__ 的对象 - 用 inspect.ismethod() 或 inspect.isfunction() 做更精确识别(需 import inspect)
- 注意 property:虽然定义时用了 @property,但 getattr 取出来的是计算后的值,不是方法对象,所以 callable() 返回 False
常见误区提醒
容易误以为 “getattr(obj, 'method')()” 中的括号是 getattr 的一部分——其实不是。getattr 只执行“取”,括号是对你拿到的对象做调用。例如:
-
getattr(obj, "age")→ 返回数字 25(不可调用) -
getattr(obj, "say")→ 返回(可调用) -
getattr(obj, "say")("hi")→ 先取方法,再执行,等价于obj.say("hi")
安全调用建议
避免因类型不确定导致运行时报错:
- 加 default 参数防 AttributeError:
getattr(obj, "x", None) - 调用前先检查:
meth = getattr(obj, "do_something", None); meth() if callable(meth) else None - 对关键逻辑,用 hasattr(obj, "x") 预判是否存在,再决定是否 getattr + callable 组合使用










