Python 如何检查对象是否有某个属性?

用 hasattr(obj, 'attr') 检查属性是否存在;配合 getattr(obj, 'attr', 默认值) 安全取值。本文给出用法、注意事项与动态属性场景。

最佳实践
Python 如何检查对象是否有某个属性?封面

用内置函数 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,其他查找异常仍传播

注意事项

  1. hasattr 会抑制 AttributeError:property 或动态查找抛出 AttributeError 时返回 False,其他异常仍传播——可能掩盖 bug;严格场景用 try/getattr 或 vars() 检查;
  2. 动态属性:是否返回 True 取决于 __getattr__ 对该名称返回值还是抛 AttributeError,不能只看是否定义该方法;
  3. 检查属性存在性同样适用:hasattr(obj, 'save');这不保证其可调用,必要时再用 callable 检查。

替代方案

# 看实例字典(不含类属性与方法;无 __dict__ 的对象可能报 TypeError)
'name' in vars(u)

# dir 是可自定义的名称列表,不保证完整列出所有动态属性
'name' in dir(u)

常见问题(FAQ)

Q:getattr 和 hasattr 哪个快? 需要取值时一次 getattr 更快(省去重复查找)。

Q:能检查模块有没有某函数吗? 能——模块也是对象,hasattr(os, 'getenv')。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台