反射的四个相关方法:
1 1 #Author : Kelvin 2 2 #Date : 2019/1/17 20:15 3 3 4 4 # hasattr setattr getattr delattr 5 5 class People: 6 6 def __init__(self,name,addr): 7 7 self.name=name 8 8 self.addr=addr 9 9 def eat(self): 10 10 print("%s 在吃饭..."%self.name) 11 11 def run(self): 12 12 print("%s 在跑步..."%self.name) 13 13 14 14 p=People("kelvin","安徽灵璧") 15 15 print(hasattr(p,"name")) #查看对象是否有指定属性和方法,返回值类型为bool型 16 16 print(hasattr(p,"eat")) 17 17 print(hasattr(p,"run")) 18 18 #>>>: True 19 19 #>>>: True 20 20 #>>>: True 21 21 22 22 print(getattr(p,"name")) #获取对象的指定属性值 23 23 #>>>: kelvin 24 24 print(getattr(p,"eat")) #获取对象的指定方法内存地址 25 25 #>>>: <bound method People.eat of <__main__.People object at 0x000001A143506198>> 26 26 print(getattr(p,"eat1","该属性不存在!")) #获取指定对象的属性或方法,如果该属性或者方法不存在,则返回第三个参数的值(默认参数) 27 27 func=getattr(p,"eat") 28 28 func() 29 29 #>>>: kelvin 在吃饭... 30 30 31 31 setattr(p,"age","22") #给对象设置一个属性值 32 32 print(p.__dict__) 33 33 #>>>: {'name': 'kelvin', 'addr': '安徽灵璧', 'age': '22'} 34 34 setattr(p,"name","bob") #如果设置的属性相同,则代表更新该属性值 35 35 print(p.__dict__) 36 36 #>>>: {'name': 'bob', 'addr': '安徽灵璧', 'age': '22'} 37 37 setattr(p,"func",lambda self:self.name+" is sb") #给对象设置一个函数 38 38 print(p.__dict__) 39 39 print(p.func(p)) 40 40 41 41 def func1(): 42 42 return "设置的func1方法!" 43 43 setattr(p,"func1",func1) #也可以设置一个已经定义的函数名进去 44 44 print(p.__dict__) 45 45 print(p.func1()) 46 46 47 47 delattr(p,"age") #删除该对象的属性值 48 48 print(p.__dict__) 49 49 #>>>: {'name': 'bob', 'addr': '安徽灵璧'}
反射的应用实例:
如果员工1和员工2 分别做一个工作,此时员工1 有事耽误了进程,员工2可以使用反射来判断员工1是否已经实现了指定的功能,如果没实现则继续实现自己的业务代码。
1 #Author : Kelvin 2 #Date : 2019/1/18 20:11 3 4 #员工一的工作 5 class People: 6 def __init__(self,name,age): 7 self.name=name 8 self.age=age 9 # def eat(self): 10 # print("%s 在吃饭..."%self.name) 11 12 #员工二的工作 13 p=People("kelvin",22) 14 if hasattr(p,"eat"): 15 p.eat() 16 else: 17 print("执行员工2自己的工作!")
双下划綫的attr方法:
1 #Author : Kelvin 2 #Date : 2019/1/18 20:45 3 class People: 4 x=10 5 def __init__(self,name): 6 self.name=name 7 def __getattr__(self, item): 8 print("__getattr__方法被执行了!") 9 def __setattr__(self, key, value): 10 print("__setattr__方法被执行了!") 11 self.__dict__[key]=value 12 def __delattr__(self, item): 13 print("__delattr__方法被执行了!") 14 self.__dict__.pop(item) 15 16 p=People("kelvin") 17 print(p.x) #对象调用已经存在的成员时,不会执行内置的__getattr__方法 18 print(p.y) #对象调用不存在的成员时,会执行内置的__getattr__方法 19 20 p.r=6 #对象添加属性时会触发__setattr__方法 21 p.x=12 #对象修改属性时会触发__setattr__方法 22 print(p.__dict__) 23 24 del p.x ##对象删除属性时会触发__delattr__方法 25 print(p.__dict__)