反射就是经过字符串来操做类或者对象的属性python
反射被称为框架的基石,为何 由于框架的设计者,不可能提早知道你的对象究竟是怎么设计的 因此你提供给框架的对象 必须经过判断验证以后才能正常使用 判断验证就是反射要作的事情, 固然经过__dict__也是能够实现的, 其实这些方法也就是对__dict__的操做进行了封装
它Python自省的核心函数框架
class A: def __init__(self): self.name = 'nick' # self.age='18' def method(self): print("method print") a = A() print(getattr(a, 'name', 'not find')) # 若是a 对象中有属性name则打印self.name的值,不然打印'not find' print(getattr(a, 'age', 'not find')) # 若是a 对象中有属性age则打印self.age的值,不然打印'not find' print(getattr(a, 'method', 'default')) # 若是有方法method,不然打印其地址,不然打印default print(getattr(a, 'method', 'default')()) # 若是有方法method,运行函数并打印None不然打印default
说明:判断对象object是否包含名为name的特性(hasattr是经过调用getattr(ojbect, name)是否抛出异常来实现的)
这是相对应的getattr()。参数是一个对象,一个字符串和一个任意值。字符串可能会列出一个现有的属性或一个新的属性。这个函数将值赋给属性的。该对象容许它提供。例如,setattr(x,“foobar”,123)至关于x.foobar = 123。
与setattr()相关的一组函数。参数是由一个对象(记住python中一切皆是对象)和一个字符串组成的。string参数必须是对象属性名之一。该函数删除该obj的一个由string指定的属性。delattr(x, 'foobar')=del x.foobar
myframework.py
函数
import importlib import settings # 框架已经实现的部分 def run(plugin): while True: cmd = input("请输入指令:") if cmd == "exit": break # 由于没法肯定框架使用者是否传入正确的对象因此须要使用反射来检测 # 判断对象是否具有处理这个指令的方法 if hasattr(plugin,cmd): # 取出对应方法方法 func = getattr(plugin,cmd) func() # 执行方法处理指令 else: print("该指令不受支持...") print("see you la la!") # 建立一个插件对象 调用框架来使用它 # wincmd = plugins.WinCMD() # 框架以外的部分就有自定义对象来完成 # 框架 得根据配置文件拿到须要的类 path = settings.CLASS_PATH # 从配置中单独拿出来 模块路径和 类名称 module_path,class_name = path.rsplit(".",1) #拿到模块 mk = importlib.import_module(module_path) # 拿到类 cls = getattr(mk,class_name) # 实例化对象 obj = cls() #调用框架 run(obj)
settings.py
插件
"""该文件做为框架的配置文件""" # 做为框架使用者 在配置文件中指定你配合框架的类是哪一个 CLASS_PATH = "libs.plugins.LinuxCMD"