什么是python的反射机制
通过字符串的形式导入模块,且通过字符串的形式寻找模块下的函数,并执行,对模块下的类属性、方法进行”增删改查”,是一种基于字符串的事件驱动
示例1-1:通过import()方法导入模块
imp = input("输入你想导入的模块:")cc = __import__(imp)inp_func = input("请输入要执行的函数:")f = getattr(cc, inp_func, None)
示例1-2:如果导入模块是有层级的,可使用fromlist=[‘{下级文件}’]
webdriver = __import__('selenium.webdriver', fromlist=['webdriver'])# 实例化,获取方法driver = webdriver.Chrome()quit = getattr(driver, 'quit')# 调用方法quit()
getattr
获取指定字符串名称的属性或者方法
def getattr(__o: Any,name: str,__default: Any = ...) -> Any
hasattr
判断对象obj是否包含name
def hasattr(__obj: Any,__name: str) -> bool
setattr
为对象设置属性或者方法,例如:setattr(x,”name”,”zaygee”)相当于x.name = ‘zaygee’
def setattr(__obj: Any,__name: str,__value: Any) -> None
delattr
删除指定字符串名称的属性或者方法
def delattr(__obj: Any,__name: str) -> None
示例2-1
class A:class_name = 'AAAAAA'def __init__(self, name):self.name = namedef method_1(self):print("我叫{},我是方法1".format(self.name))a = A('zaygee')print(hasattr(a, 'class_name')) # Trueprint(hasattr(A, 'class_name')) # Trueprint(hasattr(A, 'name')) #Falseprint(getattr(a, 'class_name', None)) # AAAAAAgetattr(a, 'method_1')() # 我叫zaygee,我是方法1delattr(A, 'class_name')print(getattr(a, 'class_name', 'class_name不存在')) # class_name不存在setattr(a, 'class_name', '更新class_name的值')print(getattr(a, 'class_name', 'class_name已经删除')) # 更新class_name的值
web框架路由实现示例
class target_module:@staticmethoddef login():print('登录成功')@staticmethoddef logout():print('退出成功')
import target_moduleurl = input("url: ")target_func = url.split("/")[-1] # 分割url,并取出url最后一个字符串if hasattr(target_module, target_func): # 判断在target_module模块中是否存在target_func这个字符串target_func = getattr(target_module, target_func) # 获取target_func的引用target_func() # 执行else:print("404")-------#url: www.baidu.com/login#登录成功
