Python 如何检查对象是否有某个属性?
用 hasattr(obj, 'attr') 检查属性是否存在;配合 getattr(obj, 'attr', 默认值) 安全取值。本文给出用法、注意事项与动态属性场景。
用内置函数 hasattr(obj, '属性名') 返回 True/False;取值时用 getattr(obj, '属性名', 默认值) 一步完成"有就取、没有用默认",更 Pythonic。
基本用法
class User:
def __init__(self):
self.name = "Tom"
u = User()
hasattr(u, 'name') # True
hasattr(u, 'email') # False
安全取值(推荐)
# 代替 if hasattr(...): x = obj.attr
email = getattr(u, 'email', '未设置')
注意事项
- hasattr 会吞掉属性内部的异常:属性是 property 且内部抛错时,hasattr 返回 False——可能掩盖 bug;严格场景用 try/getattr 或
vars()检查; - 动态属性:
__getattr__定义过的对象,hasattr 对几乎任何名字都返回 True; - 检查方法存在性同样适用:
hasattr(obj, 'save')。
替代方案
# 看实例字典(不含类属性与方法)
'name' in vars(u)
# 看类与实例全部属性
'name' in dir(u)
常见问题(FAQ)
Q:getattr 和 hasattr 哪个快? 需要取值时一次 getattr 更快(省去重复查找)。
Q:能检查模块有没有某函数吗? 能——模块也是对象,hasattr(os, 'getenv')。