__getattr__ 是 Python 类中的一个特殊方法(魔法方法),用于处理属性查找失败的场景。当访问对象的某个属性时:
- 如果该属性存在(在实例、类或父类中已定义),则直接返回属性值;
- 如果该属性不存在,则自动触发
__getattr__方法,并将属性名作为参数传入。
这个方法通常用于实现动态属性访问、默认值处理或属性不存在时的友好提示。
示例:创建带 __getattr__ 的类并实例化
下面的例子中,我们创建一个 User 类,初始化时接收一些基本属性(如姓名、年龄),并通过 __getattr__ 处理未定义的属性访问:
class User:
def __init__(self, name, age):
# 初始化已知属性
self.name = name
self.age = age
def __getattr__(self, attr_name):
"""当访问不存在的属性时触发"""
# 可以根据属性名返回自定义内容
if attr_name == "email":
# 动态生成邮箱(假设邮箱格式为 姓名@example.com)
return f"{self.name.lower()}@example.com"
elif attr_name == "is_adult":
# 动态判断是否成年
return self.age >= 18
else:
# 其他未定义的属性返回默认提示
return f"属性 '{attr_name}' 未定义"
# 实例化对象并传值
user1 = User("Alice", 25)
# 测试已定义的属性(不会触发__getattr__)
print("姓名:", user1.name) # 输出:姓名: Alice
print("年龄:", user1.age) # 输出:年龄: 25
# 测试未定义但在__getattr__中处理的属性
print("邮箱:", user1.email) # 输出:邮箱: alice@example.com
print("是否成年:", user1.is_adult) # 输出:是否成年: True
# 测试完全未定义的属性
print("性别:", user1.gender) # 输出:性别: 属性 'gender' 未定义
代码说明
- 类定义:
User类在__init__中接收name和age两个参数,作为实例的初始属性。 __getattr__实现:- 当访问
email时,动态生成邮箱地址(基于姓名); - 当访问
is_adult时,动态判断年龄是否大于等于 18; - 对于其他未定义的属性(如
gender),返回友好提示。
- 当访问
- 实例化与使用:
- 通过
user1 = User("Alice", 25)创建对象并传值; - 访问已定义的
name和age时,直接返回值(不触发__getattr__); - 访问未定义的属性时,自动触发
__getattr__并返回处理结果。
- 通过
这种机制的优势在于:无需预先定义所有可能的属性,可根据需求动态生成属性值,让类的使用更灵活。
返回文章列表
评论区 0