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

getattr 本身不区分属性访问还是方法调用,它只负责按名字取值——取出来是什么类型,就按什么类型处理。
getattr(obj, "name") 返回的可能是:
不能靠 getattr 判断,而要检查返回值本身:
callable(getattr(obj, "x")) 为 True,大概率是方法、函数或实现了 __call__ 的对象容易误以为 “getattr(obj, 'method')()” 中的括号是 getattr 的一部分——其实不是。getattr 只执行“取”,括号是对你拿到的对象做调用。例如:
getattr(obj, "age") → 返回数字 25(不可调用)getattr(obj, "say") → 返回 (可调用)getattr(obj, "say")("hi") → 先取方法,再执行,等价于 obj.say("hi")
避免因类型不确定导致运行时报错:
getattr(obj, "x", None)
meth = getattr(obj, "do_something", None); meth() if callable(meth) else None