什么是python的反射机制

通过字符串的形式导入模块,且通过字符串的形式寻找模块下的函数,并执行,对模块下的类属性、方法进行”增删改查”,是一种基于字符串的事件驱动

示例1-1:通过import()方法导入模块

  1. imp = input("输入你想导入的模块:")
  2. cc = __import__(imp)
  3. inp_func = input("请输入要执行的函数:")
  4. f = getattr(cc, inp_func, None)

示例1-2:如果导入模块是有层级的,可使用fromlist=[‘{下级文件}’]

  1. webdriver = __import__('selenium.webdriver', fromlist=['webdriver'])
  2. # 实例化,获取方法
  3. driver = webdriver.Chrome()
  4. quit = getattr(driver, 'quit')
  5. #  调用方法
  6. quit()

getattr

获取指定字符串名称的属性或者方法

  1. def getattr(__o: Any,
  2. name: str,
  3. __default: Any = ...) -> Any

hasattr

判断对象obj是否包含name

  1. def hasattr(__obj: Any,
  2. __name: str) -> bool

setattr

为对象设置属性或者方法,例如:setattr(x,”name”,”zaygee”)相当于x.name = ‘zaygee’

  1. def setattr(__obj: Any,
  2. __name: str,
  3. __value: Any) -> None

delattr

删除指定字符串名称的属性或者方法

  1. def delattr(__obj: Any,
  2. __name: str) -> None

示例2-1

  1. class A:
  2. class_name = 'AAAAAA'
  3. def __init__(self, name):
  4. self.name = name
  5. def method_1(self):
  6. print("我叫{},我是方法1".format(self.name))
  7. a = A('zaygee')
  8. print(hasattr(a, 'class_name')) # True
  9. print(hasattr(A, 'class_name')) # True
  10. print(hasattr(A, 'name')) #False
  11. print(getattr(a, 'class_name', None)) # AAAAAA
  12. getattr(a, 'method_1')() # 我叫zaygee,我是方法1
  13. delattr(A, 'class_name')
  14. print(getattr(a, 'class_name', 'class_name不存在')) # class_name不存在
  15. setattr(a, 'class_name', '更新class_name的值')
  16. print(getattr(a, 'class_name', 'class_name已经删除')) # 更新class_name的值

web框架路由实现示例

  1. class target_module:
  2. @staticmethod
  3. def login():
  4. print('登录成功')
  5. @staticmethod
  6. def logout():
  7. print('退出成功')
  1. import target_module
  2. url = input("url: ")
  3. target_func = url.split("/")[-1] # 分割url,并取出url最后一个字符串
  4. if hasattr(target_module, target_func): # 判断在target_module模块中是否存在target_func这个字符串
  5. target_func = getattr(target_module, target_func) # 获取target_func的引用
  6. target_func() # 执行
  7. else:
  8. print("404")
  9. -------
  10. #url: www.baidu.com/login
  11. #登录成功