反射
反射就是通过字符串的形式,导入模块;通过字符串的形式,去模块寻找指定函数,并执行。利用字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员,一种基于字符串的事件驱动!
hasattr
判断对象中是否有这个方法或变量
class Person(object): def __init__(self,name): self.name = name def walk(self): print('{} is walking'.format(self.name)) li = Person('libai') print(hasattr(li,'name'))#True。因为存在name变量 print(hasattr(li,'walk'))#True。因为存在walk方法 print(hasattr(li,'age'))#False。因为不存在age方法或变量
getattr
获取对象中的方法或变量的内存地址
class Person(object): def __init__(self,name): self.name = name def walk(self): print('{} is walking'.format(self.name)) li = Person('libai') n = getattr(li,'name')#获取name变量的内存地址 print(n) f = getattr(li,'walk')#获取walk方法的内存地址 f() #调用walk方法 #我们发现getattr有三个参数,那么第三个参数是做什么的呢? s = getattr(li,'age','not found') print(s) # 打印结果:not find。因为age在对象s中找不到,本应该报错,属性找不到,但因为修改了找不到就输出not find
hasattr、getattr练习
# 通过反射 # 对象名 获取对象属性 和 普通方法 # 类名 获取静态属性 和类方法 和 静态方法
参考源码:hasattr_getattr.py
setattr
为对象添加变量或方法
def func(self): print('{} is walking'.format(self.name)) class Person(object): def __init__(self,name): self.name = name li = Person('libai') setattr(li,'walk',func)#将func函数添加到对象li中,并命名为walk li.walk(li) #调用walk方法,因为这是额外添加的方法,需要手动传入对象 setattr(li,'age',28) #添加一个变量age print(li.age) #打印结果
delattr
删除对象中的变量。注意:不能用于删除方法
class Person(object): def __init__(self,name): self.name = name def walk(self): print('{} is walking'.format(self.name)) li = Person('libai') delattr(li,'name') #删除name 变量 print(li.name) #引发异常
反射当前模块成员
name = 'kk' import sys # print(sys.modules) # print(getattr(sys.modules['__main__'],'name')) print(getattr(sys.modules[__name__],'name'))#获取当前模块的属性 import time t = input('>>>') #不带参数,测试输入:asctime # ti = getattr(time,t) # print(ti()) #带参数的处理,测试输入:strftime ti = getattr(time,t)('%Y-%m-%d %H:%M:%S') print(ti)