什么是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 = name
def method_1(self):
print("我叫{},我是方法1".format(self.name))
a = A('zaygee')
print(hasattr(a, 'class_name')) # True
print(hasattr(A, 'class_name')) # True
print(hasattr(A, 'name')) #False
print(getattr(a, 'class_name', None)) # AAAAAA
getattr(a, 'method_1')() # 我叫zaygee,我是方法1
delattr(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:
@staticmethod
def login():
print('登录成功')
@staticmethod
def logout():
print('退出成功')
import target_module
url = 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
#登录成功