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': ''}

 

 

三、为什么用自省、反射

  可以事先定义好接口,等接口真正完成后才调用。实现即插即用,后期绑定

 

 

 

 

 

 

 

 

 

posted on 2019-11-18 21:04  别动我的锅  阅读(96)  评论(0)    收藏  举报

导航

levels of contents