python-自省/反射
一、自省、反射概念
程序可以访问、检查、修改它本身状态或行为的一种能力
二、python实现自省的四个函数
1、hasattr
是否能调用属性,返回布尔值
2、getattr
获取属性值,没有则报错
3、setattr
修改、新增属性
4、delattr
删除属性
实例
class Palyer: def __init__(self,name,age): self.name = name self.age = age def paly_ball(self): print("%s在练习投篮" %self.name) def sleep(self): print("%s在休息" %self.name) # 实例化 p = Palyer("周琦",26) print("属性:",p.__dict__) # 判断是否可以调用name属性 print("p实例是否能调用属性name:",hasattr(p,"name")) print("p实例是否能调用属性paly_ball:",hasattr(p,"paly_ball")) print("p实例是否能调用属性eat:",hasattr(p,"eat")) # 获取属性值 print("name属性的值:",getattr(p,"name")) # print("eat属性的值:",getattr(p,"eat")) # 没有传入默认参数时,遇到没有的属性时,报错 print("eat属性的值:",getattr(p,"eat","没有该属性")) # 修改、新增属性 p.name = "郭艾伦" # 使用字典修改方式修改name属性 setattr(p,"age",30) # 使用setattr方式修改age属性的值为30 print("修改后属性:",p.__dict__) p.sex = "男" # 使用字典方式新增sex属性 setattr(p,'height',210) print("新增后属性:",p.__dict__) # 删除属性 del p.height # 使用字典方式删除height属性 delattr(p,"age") #使用delattr方法删除age属性 print("删除后属性:",p.__dict__)
运行结果
属性: {'name': '周琦', 'age': 26}
p实例是否能调用属性name: True
p实例是否能调用属性paly_ball: True
p实例是否能调用属性eat: False
name属性的值: 周琦
eat属性的值: 没有该属性
修改后属性: {'name': '郭艾伦', 'age': 30}
新增后属性: {'name': '郭艾伦', 'age': 30, 'sex': '男', 'height': 210}
删除后属性: {'name': '郭艾伦', 'sex': '男'}
三、为什么用自省、反射
可以事先定义好接口,等接口真正完成后才调用。实现即插即用,后期绑定
浙公网安备 33010602011771号