Python笔记之`getattr`和`hasattr`用法详解
Python笔记之getattr
和hasattr
用法详解
code review!
文章目录
- Python笔记之`getattr`和`hasattr`用法详解
- 1. `getattr` 用法详解
- 1.1 基本作用
- 1.2 示例
- 1.3 原理
- 2. `hasattr` 用法详解
- 2.1 基本作用
- 2.2 示例
- 2.3 原理
- 3. 二者区别与联系
- 3.1 联系
- 3.2 区别
- 3.3 注意
- 4. 实用技巧与注意事项
- 4.1 实用技巧
- 4.2 注意事项
- 5. 综合示例
- 5.1 示例代码
- 6. 总结表
1. getattr
用法详解
1.1 基本作用
getattr(object, name[, default])
用于动态获取对象的属性值。
object
:要操作的对象。name
:属性名(字符串)。default
(可选):如果属性不存在,返回的默认值(否则会抛异常)。
1.2 示例
class Person:name = "Alice"age = 20person = Person()print(getattr(person, "name")) # 输出: Alice
print(getattr(person, "age")) # 输出: 20
print(getattr(person, "gender", "女")) # 属性不存在,输出: 女
1.3 原理
getattr
实际上会调用对象的__getattribute__
方法。- 如果找不到属性且提供了
default
,则返回default
,否则抛出AttributeError
。
2. hasattr
用法详解
2.1 基本作用
hasattr(object, name)
用于判断对象是否有某个属性。
object
:要检查的对象。name
:属性名(字符串)。
返回值:
- 存在则返回
True
,否则返回False
。
2.2 示例
class Person:name = "Alice"person = Person()print(hasattr(person, "name")) # 输出: True
print(hasattr(person, "age")) # 输出: False
2.3 原理
hasattr
实际上会尝试用getattr(object, name)
获取属性。- 如果没有抛出
AttributeError
,就返回True
,否则为False
。
3. 二者区别与联系
3.1 联系
- 都用于动态操作对象属性,底层都依赖于魔法方法
__getattribute__
。
3.2 区别
getattr
用于取值,可以设置默认值。hasattr
用于判断属性是否存在,不取值。
3.3 注意
⚠️ 注意:
hasattr
内部实际上是 try-except 机制,属性访问可能触发属性的 getter 或 property 代码块!
4. 实用技巧与注意事项
4.1 实用技巧
- 用
getattr
动态读取属性,适合反射场景(如 ORM、插件、配置读取等)。 - 用
hasattr
判断属性是否存在,避免代码报错。
4.2 注意事项
- 如果属性不存在且没有传递
default
,getattr
会直接报错。 hasattr
访问属性时,带有副作用时要小心(比如 property/自定义__getattr__
)。
5. 综合示例
5.1 示例代码
class Demo:def __init__(self):self.x = 10@propertydef y(self):print("访问了 y")return 20d = Demo()
print(hasattr(d, 'x')) # True
print(hasattr(d, 'y')) # True,同时会打印: 访问了 y
print(getattr(d, 'y')) # 访问了 y,输出: 20
print(getattr(d, 'z', '不存在')) # 输出: 不存在
6. 总结表
方法 | 作用 | 返回值 | 不存在时行为 |
---|---|---|---|
getattr | 获取属性值 | 属性值/默认值 | 抛 AttributeError/返回默认 |
hasattr | 判断属性是否存在 | True/False | 返回 False |