反射的应用 | Python

Posted pymkl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了反射的应用 | Python相关的知识,希望对你有一定的参考价值。

# 为什么要把类写在配置文件里?
# 把类名写在配置文件里,比如django,添加一个中间件配置,为什么我们就可以直接调用这个类了?
MIDDLEWARE_CLASSES = (
    应用名.middleware.ForbiddenIpsMiddleware,
)

# 其实内部做了一个反射的操作,在middleware这个模块中,
# 载入了ForbiddenIpsMiddleware这个类;
# 那么问题来了,通过这个一个字符串怎么找到这个类呢?
# 反射。

技术分享图片

# echo_one.py
  class EchoOne():
      def run(self):
          return 1
# echo_two.py
  class EchoTwo():
      def run(self):
          return 2
# echo_three.py
  class EchoThree():
      def run(self):
          return 3
# 给python解释器添加路径
import os, sys
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# print(os.path.abspath(__file__))
# print(os.path.dirname(os.path.abspath(__file__)))
# print(BASE_DIR)
# >> /home/python/Desktop/echo/conf.py
# >> /home/python/Desktop/echo
# >> /home/python/Desktop  # 根目录
sys.path.append(BASE_DIR)

settings = {
    ret01: echo.class01.echo_one.EchoOne,
    ret02: echo.class01.echo_two.EchoTwo,
    ret03: echo.class01.echo_three.EchoThree,
}
from conf import settings


for k,v in settings.items():
    # 要在这里循环注册配置文件中写的每个类
    # 1.将字符串拆分成‘类所在的包路径‘|‘类名‘
    module_path, classname = v.rsplit(., maxsplit=1)
    # 2.获取类所在模块对象
    import importlib
    m = importlib.import_module(module_path)
    # print(m)
    # 3.根据根据类名(模块的属性),从模块中反射出对应的类
    cls = getattr(m, classname)
    # 4.执行一下类中的方法确认操作是否正确
    print(cls().run())

 

以上是关于反射的应用 | Python的主要内容,如果未能解决你的问题,请参考以下文章

知识点 - python 反射

OpenGL片段着色器不照亮场景

为啥我的 Ray March 片段着色器反射纹理查找会减慢我的帧速率?

什么是反射?以及应用场景?

53 什么是反射?以及应用场景?

我在哪里更改此 Python 代码片段以将临时文件保存在 tmp 文件夹中?