反射
反射
- 在 Python 中,反射是指在运行时获取对象的信息,包括对象的属性和方法,以及动态地操作这些属性和方法。在面向对象编程中,反射允许你在运行时检查类和对象的信息,而不是在编写代码时硬编码这些信息。
(1)获取对象属性值和方法/调用getattr()
-
语法:
getattr(object, name[, default])
-
使用
getattr()
函数可以获取对象的属性值。 -
不存在则报错,但是可以指定不存在的时候返回的默认值
class Heart: def __init__(self): self.age = 18 heart = Heart() print(getattr(heart, 'age')) # 输出: 18 print(getattr(heart, 'name', None)) # 输出: None
- 使用
getattr()
函数可以获取对象的方法。
class Heart: def talk(self): return f'说话' heart = Heart() method = getattr(heart, 'talk') result = method() print(result) # 输出: 说话
- 使用
getattr()
函数获取方法,然后直接调用。
class Heart: def talk(self): return "说话" heart = Heart() method = getattr(heart, 'talk') result = method() print(result) # 输出: 说话
(2)设置对象的属性setattr()
-
语法:
setattr(object, name, value)
-
使用
setattr()
函数可以设置对象的属性值。
class Heart: def __init__(self): self.age = 18 heart = Heart() setattr(heart, 'age', 100) print(heart.age) # 输出: 100
(3)检查对象是否有某个属性或方法hasattr()
-
语法:
hasattr(object, name)
-
使用
hasattr()
函数可以检查对象是否具有指定的属性或方法。 -
存在就返回True,不存在就返回False
class Heart: def __init__(self): self.age = 42 heart = Heart() has = hasattr(heart, 'age') print(has) # 输出: True has1 = hasattr(heart, 'name') print(has1) # 输出: False
(4)删除对象属性delattr()
-
语法:
delattr(object, name)
-
使用
delattr()
函数可以删除对象属性的内建函数。
class Heart: def __init__(self): self.age = 18 heart = Heart() print(hasattr(heart, 'age')) # True delattr(heart, 'age') print(hasattr(heart, 'age')) # False
小练习
class Heart: def __init__(self): self.age = 18 heart = Heart() def func(obj=None, name=None, value=None): if hasattr(obj, name): return getattr(obj, name) else: setattr(obj, name, value) print(f'设置成功') return func(obj=obj, name=name, value=value) print(func(obj=heart, name='age')) # 18 print(func(obj=heart, name='name', value='heart')) # 设置成功 heart def read(): print(f'正在读书') func(obj=heart, name='read', value=read)() # 设置成功 正在读书
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通