面向对象_反射
反射指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)。
python面向对象中的反射是指通过字符串的形式操作对象相关的属性。
python中有四个可以实现自省的函数
hasattr(object,name) 判断object中有没有一个name字符串对应的方法或属性 getattr(object,name,default=None) 获取object的name属性,name属性入股不存在,当给定关键字参数default时则返回None;如果未设置关键字参数则报错 seattr(x,y,z) 设置属性:x.y=z delattr(x,y) 删除属性x.y 如果属性不存在则报错
应用实例
class Animal(): feature = 'live' def __init__(self,name,gender): self.name = name self.gender = gender def eat(self): print('%s is eating'%self.name) def run(self): print('%s is running'%self.name) animal1 = Animal('cat','female') #检测是否含有属性 print(hasattr(animal1,'name')) print(hasattr(animal1,'eat')) #获取属性 n=getattr(animal1,'name') print(n) func = getattr(animal1,'eat') func() #获取属性,不存在就报错 getattr(animal1,'sleep') #设置属性 setattr(animal1,'meek',True) setattr(animal1,'have_fun',lambda self:print('%s is having fun'%self.name)) print(animal1.__dict__) animal1.have_fun(animal1) #删除属性 delattr(animal1,'meek') delattr(animal1,'have_fun') #删除属性,不存在则报错 #delattr(animal1,'have_fun1') print(animal1.__dict__)

#类也是对象 class Animal(object): staticField = 'live' def __init__(self): self.name = 'cat' def eat(self): return 'eat' @staticmethod def bar(): return 'bar' print(getattr(Animal,'staticField')) print(getattr(Animal,'eat')) print(getattr(Animal,'bar'))

import sys def s1(): print('打印s1') func_name = s1.__name__ this_module = sys.modules[__name__] #python中所有加载到内存的模块都放在sys.modules print(hasattr(this_module,'s1')) res = getattr(this_module,'s1') #根据函数名获得函数对象 res()
导入其他模块,利用反射查找该模块是否具有该方法

def my_test(): print('module_test')
import module_test as obj print(hasattr(obj,'my_test')) getattr(obj,'my_test')()
动态导入模块
在程序运行的过程中,根据变量或者配置动态的决定导入哪个模块
目录如图

def my_test(): print('my_test import success')
#moduleImport_test.py import importlib res = importlib.import_module('import_lib.metaclass') res.my_test()