应使用 hasattr 检查名称改写后的私有属性名,如 _user__password;推荐动态拼接 f'_{obj.__class__.__name__}__password' 以适配继承和类名变更,避免硬编码或直接用 __password。

调用 Cutout.Pro 视觉处理 API 进行背景移除、人像抠图和照片增强,支持文件上传与图片 URL 输入。
用 hasattr 检查改写后的私有属性名
Python 会把 `__attr` 自动改写为 `_ClassName__attr`。因此,检测时必须使用改写后的完整名称:- 假设类名为 `User`,私有字段为 `__password`,则真实属性名为 `_User__password`
- 调用 `hasattr(obj, '_User__password')` 才能返回正确结果
- 直接写 `hasattr(obj, '__password')` 总是返回 `False`,即使该字段已初始化
避免硬编码类名的稳妥写法
类名可能动态变化或继承自父类,推荐用 `obj.__class__.__name__` 动态拼接:- `attr_name = f'_{obj.__class__.__name__}__password'`
- `if hasattr(obj, attr_name): ...`
- 这样可适配子类或重命名类的情况,比写死类名更健壮
注意:__dict__ 和 dir() 的局限性
虽然 `'_User__password' in obj.__dict__` 也能判断,但要注意:- `__dict__` 不包含类属性、继承属性,且对象若定义了 `__slots__` 可能没有 `__dict__`
- `dir(obj)` 会列出改写后的私有名,但它是排序后的列表,性能略低,且含大量内置方法,不推荐仅用于存在性检查
- `hasattr` 是最通用、语义最清晰的选择
不建议依赖 try-except 访问私有字段
虽然可以 `try: _ = obj._User__password`,但这样做有风险:- 暴露了本应封装的内部实现细节
- 一旦类重构或改名,代码会静默失效
- 违背封装原则,应优先通过公开方法(如 `get_password()`)间接访问










