什么是反射
反射主要指程序可以访问,检测和修改它本身状态或行为的一种能力(自省)。
面向对象的反射
getarre
getarre() ,一个内置函数
作用是通过字符串类型的属性名,得到真正的这个字符串的名字对应的对象的属性值
所有的 a.b 都可以变成 getattr(a,'b')
用字符串数据类型的变量名,来获取实际的变量值(找到这个变量对应的内存地址)
class Student: def __init__(self,name): self.name = name wu = Student('吴') ret = getattr(wu,'name') 此时 ret 就相当于 wu.name
hasattr
hasattr(),一个内置函数
if hasattr(a,b) 判断b是不是对象a里面的属性
class Student: def __init__(self,name): self.name = name wu = Student('吴') name = input('>>>') if hasattr(wu,name): 判断输入的内容是否是wu这个对象里的属性或方法 ret = getattr(wu,name)
callable
callable(a) 一个内置函数,作用是判断a是否可以被调用
实例应用
class Jay: def __init__(self,name): self.name = name def sweet(self): print('告白气球') def warm(self): print('不能说的秘密') def real(self): print('稻香') def guitar(self): print('晴天') def nice(self): print('七里香') j = Jay('周杰伦') while 1: song = input('>>>') if hasattr(j,song): nb = getattr(j,song) if callable(nb): nb() else: print(nb) else: print('输入错误,请重新输入')
class Foo: f = '类的静态变量' def __init__(self,name,age): self.name=name self.age=age def say_hi(self): print('hi,%s'%self.name) obj=Foo('egon',73) #检测是否含有某属性 print(hasattr(obj,'name')) print(hasattr(obj,'say_hi')) #获取属性 n=getattr(obj,'name') print(n) func=getattr(obj,'say_hi') func() print(getattr(obj,'aaaaaaaa','不存在啊')) #报错 #设置属性 setattr(obj,'sb',True) setattr(obj,'show_name',lambda self:self.name+'sb') print(obj.__dict__) print(obj.show_name(obj)) #删除属性 delattr(obj,'age') delattr(obj,'show_name') delattr(obj,'show_name111')#不存在,则报错 print(obj.__dict__)