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', '未设置') # 默认值只用于 AttributeError,其他查找异常仍传播
注意事项
- hasattr 会抑制 AttributeError:property 或动态查找抛出 AttributeError 时返回 False,其他异常仍传播——可能掩盖 bug;严格场景用 try/getattr 或
vars()检查; - 动态属性:是否返回 True 取决于
__getattr__对该名称返回值还是抛 AttributeError,不能只看是否定义该方法; - 检查属性存在性同样适用:
hasattr(obj, 'save');这不保证其可调用,必要时再用 callable 检查。
替代方案
# 看实例字典(不含类属性与方法;无 __dict__ 的对象可能报 TypeError)
'name' in vars(u)
# dir 是可自定义的名称列表,不保证完整列出所有动态属性
'name' in dir(u)
常见问题(FAQ)
Q:getattr 和 hasattr 哪个快? 需要取值时一次 getattr 更快(省去重复查找)。
Q:能检查模块有没有某函数吗? 能——模块也是对象,hasattr(os, 'getenv')。